Как сгенерировать случайное число в java

Модуль random

Для того, чтобы полноценно использовать эту опцию в своей работе, необходимо ознакомится с главными ее составляющими. Они выступают некими методами, позволяющими выполнять определенные действия. Основная стандартная библиотека Рython состоит из таких компонентов со следующими параметрами:

  • random () – может вернуть число в промежуток значений от 0 до 1;
  • seed (a) – производит настройку генератора на новую последовательность а;
  • randint (a,b) – возвращает значение в диапазон данных от а до b;
  • randrange (a, b, c) – выполняет те же функции, что и предыдущая, только с шагом с;
  • uniform (a, b) – производит возврат вещественного числа в диапазон от а до b;
  • shuffle (a) – миксует значения, находящиеся в перечне а;
  • choice (a) – восстанавливает обратно случайный элемент из перечня а;
  • sample (a, b) – возвращает на исходную позицию последовательность длиной b из перечня а;
  • getstate () – обновляет внутреннее состояние генератора;
  • setstate (a) – производит восстановление внутреннего состояния генератора а;
  • getrandbits (a) – восстанавливает а при выполнении случайного генерирования бит;
  • triangular (a, b, c) – показывает изначальное значение числа от а до b с шагом с.

Если вам необходимо применить для задания инициализирующееся число псевдо случайной последовательности, то не обойтись без функции seed. После ее вызова без применения параметра, используется значение системного таймера. Эта опция доступна в конструкторе класса Random.

Более показательными будут примеры на основе вышеописанного материала. Для возможности воспользоваться генерацией случайных чисел в Рython 3, сперва вам потребуется выполнить импорт библиотеки random, внеся сперва ее в начало исполняемого файла при помощи ключевого слова import.

Вещественные числа

Модуль оснащен одноименной функцией random. Она более активно используется в Питоне, чем остальные. Эта функция позволяет произвести возврат числа в промежуток значений от 0 до 1. Вот пример трех основных переменных:

import randoma = random.random()b = random.random()print(a)print(b)

0.5479332865190.456436031781

Целые числа

Чтобы в программе появились случайные числа из четко заданного диапазона, применяется функция randit. Она обладает двумя аргументами: максимальным и минимальным значением. Она отображает значения, указанные ниже в генерации трех разных чисел от 0 до 9.

import randoma = random.randint(0, 9)b = random.randint(0, 9)print(a)print(b)

47

Диапазон целых чисел

Использование в такой ситуации метода randage поможет сгенерировать целочисленные значения, благодаря сотрудничеству с тремя основными параметрами:

  • минимальное значение;
  • максимальное;
  • длина шага.

При вызове функции с одним требованием, граница будет установлена на значении 0, а промежуток будет установлен на 1. Для двух аргументов длина шага уже высчитывается автоматически. Вот пример работы этой опции на основе трех разных наборов.

import randoma = random.randrange(10)b = random.randrange(2, 10)c = random.randrange(2, 10, 2)print(a)print(b)print(c)

952

Диапазон вещественных чисел

Генерация вещественных чисел происходит при использовании функции под названием uniform. Она регулируется всего двумя параметрами: минимальным и максимальным значением. Пример создания демонстрации с переменными a, b и c.

import randoma = random.uniform(0, 10)b = random.uniform(0, 10)print(a)print(b)

4.856873750913.66695202551

How can this be useful ?

Sometimes, the test fixture does not really matter to the test logic. For example, if we want to test the result of a new sorting algorithm, we can generate random input data and assert the output is sorted, regardless of the data itself:

@org.junit.Test
public void testSortAlgorithm() {

   // Given
   int[] ints = easyRandom.nextObject(int[].class);

   // When
   int[] sortedInts = myAwesomeSortAlgo.sort(ints);

   // Then
   assertThat(sortedInts).isSorted(); // fake assertion

}

Another example is testing the persistence of a domain object, we can generate a random domain object, persist it and assert the database contains the same values:

@org.junit.Test
public void testPersistPerson() throws Exception {
   // Given
   Person person = easyRandom.nextObject(Person.class);

   // When
   personDao.persist(person);

   // Then
   assertThat("person_table").column("name").value().isEqualTo(person.getName()); // assretj db
}

There are many other uses cases where Easy Random can be useful, you can find a non exhaustive list in the wiki.

Method Summary

All MethodsInstance MethodsConcrete Methods

Modifier and Type Method Description
Returns an effectively unlimited stream of pseudorandom values, each between zero (inclusive) and one
(exclusive).
Returns an effectively unlimited stream of pseudorandom values, each conforming to the given origin (inclusive) and bound
(exclusive).
Returns a stream producing the given number of
pseudorandom values, each between zero
(inclusive) and one (exclusive).
Returns a stream producing the given number of
pseudorandom values, each conforming to the given origin
(inclusive) and bound (exclusive).
Returns an effectively unlimited stream of pseudorandom
values.
Returns an effectively unlimited stream of pseudorandom values, each conforming to the given origin (inclusive) and bound
(exclusive).
Returns a stream producing the given number of
pseudorandom values.
Returns a stream producing the given number
of pseudorandom values, each conforming to the given
origin (inclusive) and bound (exclusive).
Returns an effectively unlimited stream of pseudorandom
values.
Returns a stream producing the given number of
pseudorandom values.
Returns an effectively unlimited stream of pseudorandom values, each conforming to the given origin (inclusive) and bound
(exclusive).
Returns a stream producing the given number of
pseudorandom , each conforming to the given origin
(inclusive) and bound (exclusive).
Generates the next pseudorandom number.
Returns the next pseudorandom, uniformly distributed
value from this random number generator’s
sequence.
Generates random bytes and places them into a user-supplied
byte array.
Returns the next pseudorandom, uniformly distributed
value between and
from this random number generator’s sequence.
Returns the next pseudorandom, uniformly distributed
value between and from this random
number generator’s sequence.
Returns the next pseudorandom, Gaussian («normally») distributed
value with mean and standard
deviation from this random number generator’s sequence.
Returns the next pseudorandom, uniformly distributed
value from this random number generator’s sequence.
Returns a pseudorandom, uniformly distributed value
between 0 (inclusive) and the specified value (exclusive), drawn from
this random number generator’s sequence.
Returns the next pseudorandom, uniformly distributed
value from this random number generator’s sequence.
Sets the seed of this random number generator using a single
seed.

Secure Random Number – Best Practices

2.1. Determine performance criteria and workload balancing

If performance is a premier consideration, then use , which seeds from . SHA1PRNG can be 17 times faster than NativePRNG, but seeding options are fixed.

Seeding with is more flexible, but it blocks if entropy is not great enough on the server since it reads from . If you don’t know where to begin, start with .

2.2. Don’t accept defaults; specify the PRNG and the provider you want to use

Specify your criteria like this:

SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "SUN");

Following is additional information about supported PRNGs and providers.

The following is a list of PRNGs for the SUN provider:

  • SHA1PRNG (Initial seeding is currently done via a combination of system attributes and the java.security entropy gathering device)
  • NativePRNG (nextBytes() uses /dev/urandom, generateSeed() uses /dev/random)
  • NativePRNGBlocking (nextBytes() and generateSeed() use /dev/random)
  • NativePRNGNonBlocking (nextBytes() and generateSeed() use /dev/urandom)
  • NativePRNGBlocking and NativePRNGNonBlocking are available in JRE 8+.

For information on additional providers, see Java Cryptography Architecture Oracle Providers Documentation for JDK 8. Oracle also provides documentation describing the providers by OS platform.

2.3. Provide more opportunities increase entropy

Create a new instance of periodically and reseed, like this:

SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
sr.setSeed(SecureRandom.generateSeed(int))

Periodic reseeding defends against data disclosure if a seed is leaked. If using SHA1PRNG, always call immediately after creating a new instance of the PRNG.

2.4. Reduce predictability

If , a configuration parameter in the file, or the system property is assigned with a predictable file/URL, then SecureRandom can become predictable.

2.5. Patch old Java versions

JRE versions older than 1.4.2 have known problems generating SHA1PRNG secure seeds. Then again, if you’re using versions of Java this old, you have bigger security concerns.

Old versions of Java are very insecure, and staying up-to-date on patches is very important. One of the best ways to keep your customers safe is to quickly certify your software against the most recent Oracle Critical Patch Update possible.

Happy Learning !!

Псевдослучайные числа

Иногда программист сталкивается с простыми, казалось бы, задачами: «отобрать случайный фильм для вечернего просмотра из определенного списка», «выбрать победителя лотереи», «перемешать список песен при тряске смартфона», «выбрать случайное число для шифрования сообщения», и каждый раз у него возникает очень закономерный вопрос: а как получить это самое случайное число?

Вообще-то, если вам нужно получить «настоящее случайное число», сделать это довольно-таки трудно. Вплоть до того, что в компьютер встраивают специальные математические сопроцессоры, которые умеют генерировать такие числа, с выполнением всех требований к «истинной случайности».

Поэтому программисты придумали свое решение — псевдослучайные числа. Псевдослучайные числа — это некая последовательность, числа в которой на первый взгляд кажутся случайными, но специалист при детальном анализе сможет найти в них определенные закономерности. Для шифрования секретных документов такие числа не подойдут, а для имитации бросания кубика в игре — вполне.

Есть много алгоритмов генерации последовательности псевдослучайных чисел и почти все из них генерируют следующее случайное число на основе предыдущего и еще каких-то вспомогательных чисел.

Например, данная программа выведет на экран неповторяющихся чисел:

Кстати, мы говорим не о псевдослучайных числах, а именно о последовательности таких чисел. Т.к. глядя на одно число невозможно понять, случайное оно или нет.

Случайное число ведь можно получить разными способами:

Using Third-Party APIs

As we have seen, Java provides us with a lot of classes and methods for generating random numbers. However, there are also third-party APIs for this purpose.

We’re going to take a look at some of them.

3.1. org.apache.commons.math3.random.RandomDataGenerator

There are a lot of generators in the commons mathematics library from the Apache Commons project. The easiest, and probably the most useful, is the RandomDataGenerator. It uses the Well19937c algorithm for the random generation. However, we can provide our algorithm implementation.

Let’s see how to use it. Firstly, we have to add dependency:

The latest version of commons-math3 can be found on Maven Central.

Then we can start working with it:

3.2. it.unimi.dsi.util.XoRoShiRo128PlusRandom

Certainly, this is one of the fastest random number generator implementations. It has been developed at the Information Sciences Department of the Milan University.

The library is also available at Maven Central repositories. So, let’s add the dependency:

This generator inherits from java.util.Random. However, if we take a look at the JavaDoc, we realize that there’s only one way of using it —  through the nextInt method. Above all, this method is only available with the zero- and one-parameter invocations. Any of the other invocations will directly use the java.util.Random methods.

For example, if we want to get a random number within a range, we would write:

Random Date

Up until now, we generated random temporals containing both date and time components. Similarly, we can use the concept of epoch days to generate random temporals with just date components.

An epoch day is equal to the number of days since the 1 January 1970. So in order to generate a random date, we just have to generate a random number and use that number as the epoch day.

3.1. Bounded

We need a temporal abstraction containing only date components, so java.time.LocalDate seems a good candidate:

Here we’re using the  method to convert each LocalDate to its corresponding epoch day. Similarly, we can verify that this approach is correct:

3.2. Unbounded

In order to generate random dates regardless of any range, we can simply generate a random epoch day:

Our random date generator chooses a random day from 100 years before and after the epoch. Again, the rationale behind this is to generate reasonable date values:

Генерация случайных чисел с помощью класса Math

Чтобы сгенерировать случайное число Java предоставляет класс Math, доступный в пакете java.util. Этот класс содержит статичный метод Math.random(), предназначенный для генерации случайных чисел типа double .

Метод random( ) возвращает положительное число большее или равное 0,0 и меньшее 1,0. При вызове данного метода создается объект генератора псевдослучайных чисел java.util.Random.

Math.random() можно использовать с параметрами и без. В параметрах задается диапазон чисел, в пределах которого будут генерироваться случайные значения.

Пример использования Math.random():

public static double getRandomNumber(){
    double x = Math.random();
    return x;
}

Метод getRandomNumber( ) использует Math.random() для возврата положительного числа, которое больше или равно 0,0 или меньше 1,0 .

Результат выполнения кода:

Double between 0.0 and 1.0: SimpleRandomNumber = 0.21753313144345698

Случайные числа в заданном диапазоне

Для генерации случайных чисел в заданном диапазоне необходимо указать диапазон. Синтаксис:

(Math.random() * ((max - min) + 1)) + min

Разобьем это выражение на части:

  1. Сначала умножаем диапазон значений на результат, который генерирует метод random().Math.random() * (max — min)возвращает значение в диапазоне , где max не входит в заданные рамки. Например, выражение Math.random()*5 вернет значение в диапазоне , в который 5 не входит.
  2. Расширяем охват до нужного диапазона. Это делается с помощью минимального значения.
(Math.random() * ( max - min )) + min

Но выражение по-прежнему не охватывает максимальное значение.

Чтобы получить максимальное значение, прибавьте 1 к параметру диапазона (max — min). Это вернет случайное число в указанном диапазоне.

double x = (Math.random()*((max-min)+1))+min;

Существуют различные способы реализации приведенного выше выражения. Рассмотрим некоторые из них.

Случайное двойное число в заданном диапазоне

По умолчанию метод Math.random() при каждом вызове возвращает случайное число типа double . Например:

public static double getRandomDoubleBetweenRange(double min, double max){
    double x = (Math.random()*((max-min)+1))+min;
    return x;
}

Вы можете вызвать предыдущий метод из метода main, передав аргументы, подобные этому.

System.out.println("Double between 5.0 and 10.00: RandomDoubleNumber = 
"+getRandomDoubleBetweenRange(5.0, 10.00));

Результат.

System.out.println("Double between 5.0 and 10.00: RandomDoubleNumber = 
"+getRandomDoubleBetweenRange(5.0, 10.00));

Случайное целое число в заданном диапазоне

Пример генерации случайного целочисленного значения в указанном диапазоне:

public static double getRandomIntegerBetweenRange(double min, double max){
    double x = (int)(Math.random()*((max-min)+1))+min;
    return x;
}

Метод getRandomIntegerBetweenRange() создает случайное целое число в указанном диапазоне. Так как Math.random() генерирует случайные числа с плавающей запятой, то нужно привести полученное значение к типу int. Этот метод можно вызвать из метода main, передав ему аргументы следующим образом:

System.out.println("Integer between 2 and 6: RandomIntegerNumber 
= "+getRandomIntegerBetweenRange(2,6));

Результат.

Integer between 2 and 6: RandomIntegerNumber = 5

Примечание. В аргументах также можно передать диапазон отрицательных значений, чтобы сгенерировать случайное отрицательное число в этом диапазоне.

Random Numbers Using the Math Class

Java provides the Math class in the java.util package to generate random numbers.

The Math class contains the static Math.random() method to generate random numbers of the double type.

The random() method returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0. When you call Math.random(), under the hood, a java.util.Random pseudorandom-number generator object is created and used.

You can use the Math.random() method with or without passing parameters. If you provide parameters, the method produces random numbers within the given parameters.

The code to use the Math.random() method:

The getRandomNumber() method uses the Math.random() method to return a positive double value that is greater than or equal to 0.0 and less than 1.0.

The output of running the code is:

Random Numbers Within a Given Range

For generating random numbers between a given a range, you need to specify the range. A standard expression for accomplishing this is:

Let us break this expression into steps:

  1. First, multiply the magnitude of the range of values you want to cover by the result that Math.random() produces.returns a value in the range ,max–min where max is excluded. For example, if you want 5,10], you need to cover 5 integer values so you can use Math.random()*5. This would return a value in the range ,5, where 5 is not included.
  2. Next, shift this range up to the range that you are targeting. You do this by adding the min value.

But this still does not include the maximum value.

To get the max value included, you need to add 1 to your range parameter (max — min). This will return a random double within the specified range.

There are different ways of implementing the above expression. Let us look at a couple of them.

Random Double Within a Given Range

By default, the Math.random() method returns a random number of the type double whenever it is called. The code to generate a random double value between a specified range is:

You can call the preceding method from the main method by passing the arguments like this.

The output is this.

Random Integer Within a Given Range

The code to generate a random integer value between a specified range is this.

The preceding getRandomIntegerBetweenRange() method produces a random integer between the given range. As Math.random() method generates random numbers of double type, you need to truncate the decimal part and cast it to int in order to get the integer random number. You can call this method from the main method by passing the arguments as follows:

The output is this.

Note: You can pass a range of negative values to generate a random negative number within the range.

Core team and contributors

Awesome contributors

  • Adriano Machado
  • Alberto Lagna
  • Andrew Neal
  • Arne Zelasko
  • dadiyang
  • Dovid Kopel
  • Eric Taix
  • euZebe
  • Fred Eckertson
  • huningd
  • Johan Kindgren
  • Joren Inghelbrecht
  • Jose Manuel Prieto
  • kermit-the-frog
  • Lucas Andersson
  • Michael Düsterhus
  • Nikola Milivojevic
  • nrenzoni
  • Oleksandr Shcherbyna
  • Petromir Dzhunev
  • Rebecca McQuary
  • Rodrigue Alcazar
  • Ryan Dunckel
  • Sam Van Overmeire
  • Valters Vingolds
  • Vincent Potucek
  • Weronika Redlarska
  • Konstantin Lutovich
  • Steven_Van_Ophem
  • Jean-Michel Leclercq
  • Marian Jureczko
  • Unconditional One
  • JJ1216
  • Sergey Chernov

Thank you all for your contributions!

Игра в кости с использованием модуля random в Python

Далее представлен код простой игры в кости, которая поможет понять принцип работы функций модуля random. В игре два участника и два кубика.

  • Участники по очереди бросают кубики, предварительно встряхнув их;
  • Алгоритм высчитывает сумму значений кубиков каждого участника и добавляет полученный результат на доску с результатами;
  • Участник, у которого в результате большее количество очков, выигрывает.

Код программы для игры в кости Python:

Python

import random

PlayerOne = «Анна»
PlayerTwo = «Алекс»

AnnaScore = 0
AlexScore = 0

# У каждого кубика шесть возможных значений
diceOne =
diceTwo =

def playDiceGame():
«»»Оба участника, Анна и Алекс, бросают кубик, используя метод shuffle»»»

for i in range(5):
#оба кубика встряхиваются 5 раз
random.shuffle(diceOne)
random.shuffle(diceTwo)
firstNumber = random.choice(diceOne) # использование метода choice для выбора случайного значения
SecondNumber = random.choice(diceTwo)
return firstNumber + SecondNumber

print(«Игра в кости использует модуль random\n»)

#Давайте сыграем в кости три раза
for i in range(3):
# определим, кто будет бросать кости первым
AlexTossNumber = random.randint(1, 100) # генерация случайного числа от 1 до 100, включая 100
AnnaTossNumber = random.randrange(1, 101, 1) # генерация случайного числа от 1 до 100, не включая 101

if( AlexTossNumber > AnnaTossNumber):
print(«Алекс выиграл жеребьевку.»)
AlexScore = playDiceGame()
AnnaScore = playDiceGame()
else:
print(«Анна выиграла жеребьевку.»)
AnnaScore = playDiceGame()
AlexScore = playDiceGame()

if(AlexScore > AnnaScore):
print («Алекс выиграл игру в кости. Финальный счет Алекса:», AlexScore, «Финальный счет Анны:», AnnaScore, «\n»)
else:
print(«Анна выиграла игру в кости. Финальный счет Анны:», AnnaScore, «Финальный счет Алекса:», AlexScore, «\n»)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

importrandom

PlayerOne=»Анна»

PlayerTwo=»Алекс»

AnnaScore=

AlexScore=

 
# У каждого кубика шесть возможных значений

diceOne=1,2,3,4,5,6

diceTwo=1,2,3,4,5,6

defplayDiceGame()

«»»Оба участника, Анна и Алекс, бросают кубик, используя метод shuffle»»»

foriinrange(5)

#оба кубика встряхиваются 5 раз

random.shuffle(diceOne)

random.shuffle(diceTwo)

firstNumber=random.choice(diceOne)# использование метода choice для выбора случайного значения

SecondNumber=random.choice(diceTwo)

returnfirstNumber+SecondNumber

print(«Игра в кости использует модуль random\n»)

 
#Давайте сыграем в кости три раза

foriinrange(3)

# определим, кто будет бросать кости первым

AlexTossNumber=random.randint(1,100)# генерация случайного числа от 1 до 100, включая 100

AnnaTossNumber=random.randrange(1,101,1)# генерация случайного числа от 1 до 100, не включая 101

if(AlexTossNumber>AnnaTossNumber)

print(«Алекс выиграл жеребьевку.»)

AlexScore=playDiceGame()

AnnaScore=playDiceGame()

else

print(«Анна выиграла жеребьевку.»)

AnnaScore=playDiceGame()

AlexScore=playDiceGame()

if(AlexScore>AnnaScore)

print(«Алекс выиграл игру в кости. Финальный счет Алекса:»,AlexScore,»Финальный счет Анны:»,AnnaScore,»\n»)

else

print(«Анна выиграла игру в кости. Финальный счет Анны:»,AnnaScore,»Финальный счет Алекса:»,AlexScore,»\n»)

Вывод:

Shell

Игра в кости использует модуль random

Анна выиграла жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 5 Финальный счет Алекса: 2

Анна выиграла жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 10 Финальный счет Алекса: 2

Алекс выиграл жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 10 Финальный счет Алекса: 8

1
2
3
4
5
6
7
8
9
10

Игравкостииспользуетмодульrandom

 
Аннавыигралажеребьевку.

Аннавыигралаигрувкости.ФинальныйсчетАнны5ФинальныйсчетАлекса2

 
Аннавыигралажеребьевку.

Аннавыигралаигрувкости.ФинальныйсчетАнны10ФинальныйсчетАлекса2

 
Алексвыигралжеребьевку.

Аннавыигралаигрувкости.ФинальныйсчетАнны10ФинальныйсчетАлекса8

Вот и все. Оставить комментарии можете в секции ниже.

Random Number Generator in Java

There are many ways to generate a random number in java.

  1. java.util.Random class can be used to create random numbers. It provides several methods to generate random integer, long, double etc.
  2. We can also use Math.random() to generate a double. This method internally uses Java Random class.
  3. class should be used to generate random number in multithreaded environment. This class is part of Java Concurrent package and introduced in Java 1.7. This class has methods similar to Java Random class.
  4. can be used to generate random number with strong security. This class provides a cryptographically strong random number generator. However, it’s slow in processing. So depending on your application requirements, you should decide whether to use it or not.

Random Number Generation Using the Random Class

You can use the java.util.Random class to generate random numbers of different types, such as int, float, double, long, and boolean.

To generate random numbers, first, create an instance of the Random class and then call one of the random value generator methods, such as nextInt(), nextDouble(), or nextLong().

The nextInt() method of Random accepts a bound integer and returns a random integer from 0 (inclusive) to the specified bound (exclusive).

The code to use the nextInt() method is this.

The code to use the nextInt() method to generate an integer within a range is:

The nextFloat() and nextDouble() methods allow generating float and double values between 0.0 and 1.0.

The code to use both the methods is:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector