Генерация случайных чисел

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

Класс java.util.Random можно применять для генерации случайных чисел различных типов: int, float, double, long и boolean .

Для этого сначала создайте экземпляр класса Random, а затем вызовите один из методов генератора случайных значений: nextInt( ), nextDouble( ) или nextLong( ).

Метод nextInt( ) класса Random принимает граничное целое число и возвращает случайное значение int от 0 (включительно) до указанного предела (не включая).

Пример использования метода nextInt( ):

Пример использования метода nextInt ( ) для генерации целого числа в заданном диапазоне:

Методы nextFloat ( ) и nextDouble( ) позволяют генерировать числа с плавающей запятой, а также значения типа double в диапазоне от 0,0 до 1,0.

Код для использования обоих методов:

Как использовать модуль random в Python

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

В самом начале работы необходимо импортировать модуль random в программу. Только после этого его можно будет полноценно использовать. Оператор для импорта модуля random выглядит следующим образом:

Python

import random

1 importrandom

Теперь рассмотрим использование самого модуля random на простом примере:

Python

import random

print(«Вывод случайного числа при помощи использования random.random()»)
print(random.random())

1
2
3
4
5

importrandom

print(«Вывод случайного числа при помощи использования random.random()»)

print(random.random())

Вывод:

Shell

Вывод случайного числа при помощи использования random.random()
0.9461613475266107

1
2

Выводслучайногочислаприпомощииспользованияrandom.random()

0.9461613475266107

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

  • является базовой функцией модуля ;
  • Почти все функции модуля зависят от базовой функции ;
  • возвращает следующее случайное число с плавающей запятой в промежутке .

Перед разбором функций модуля random давайте рассмотрим основные сферы их применения.

Проверка: isFinite и isNaN

Помните эти специальные числовые значения?

  • (и ) — особенное численное значение, которое ведёт себя в точности как математическая бесконечность ∞.
  • представляет ошибку.

Эти числовые значения принадлежат типу , но они не являются «обычными» числами, поэтому есть функции для их проверки:

  • преобразует значение в число и проверяет является ли оно :

    Нужна ли нам эта функция? Разве не можем ли мы просто сравнить ? К сожалению, нет. Значение уникально тем, что оно не является равным ни чему другому, даже самому себе:

  • преобразует аргумент в число и возвращает , если оно является обычным числом, т.е. не :

Иногда используется для проверки, содержится ли в строке число:

Помните, что пустая строка интерпретируется как во всех числовых функциях, включая.

Сравнение

Существует специальный метод Object.is, который сравнивает значения примерно как , но более надёжен в двух особых ситуациях:

  1. Работает с : , здесь он хорош.
  2. Значения и разные: , это редко используется, но технически эти значения разные.

Во всех других случаях идентичен .

Этот способ сравнения часто используется в спецификации JavaScript. Когда внутреннему алгоритму необходимо сравнить 2 значения на предмет точного совпадения, он использует (Определение ).

Using random.nextInt() to generate random number between 1 and 10

We can simply use Random class’s nextInt() method to achieve this.

As the documentation says, this method call returns «a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive)», so this means if you call nextInt(10), it will generate random numbers from 0 to 9 and that’s the reason you need to add 1 to it.
Here is generic formula to generate random number in the range.

randomGenerator.nextInt((maximum – minimum) + 1) + minimum
In our case,
minimum = 1
maximum = 10so it will berandomGenerator.nextInt((10 – 1) + 1) + 1randomGenerator.nextInt(10) + 1

So here is the program to generate random number between 1 and 10 in java.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

packageorg.arpit.java2blog;

import java.util.Random;

publicclassGenerateRandomInRangeMain{

publicstaticvoidmain(Stringargs){

System.out.println(«============================»);

System.out.println(«Generating 10 random integer in range of 1 to 10 using Random»);

System.out.println(«============================»);

Random randomGenerator=newRandom();

for(inti=;i<10;i++){

System.out.println(randomGenerator.nextInt(10)+1);

}

}

}
 

When you run above program, you will get below output:

==============================
Generating 10 random integer in range of 1 to 10 using Random
==============================
1
9
5
10
2
3
2
5
8
1

Read also:Java random number between 0 and 1Random number generator in java

Игра в кости с использованием модуля 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 Time

Similar to what we did with dates, we can generate random temporals with just time components. In order to do that, we can use the second of the day concept. That is, a random time is equal to a random number representing the seconds since the beginning of the day.

4.1. Bounded

The java.time.LocalTime class is a temporal abstraction that encapsulates nothing but time components:

In order to generate a random time between two others, we can:

  1. Generate a random number between the second of the day of the given times
  2. Create a random time using that random number

We can easily verify the behavior of this random time generation algorithm:

4.2. Unbounded

Even unbounded time values should be in 00:00:00 until 23:59:59 range, so we can simply implement this logic by delegation:

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.

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.

Модуль 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

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.

Using simple java code with Random

You can use SecureRandom class to generate random String for you.
Let’s understand with the help of example.

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

packageorg.arpit.java2blog;

import java.security.SecureRandom;

publicclassRandomStringGeneratorMain{

privatestaticfinalStringCHAR_LIST=

«1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ»;

/**

     * This method generates random string
     * @return
     */

publicStringgenerateRandomStringUsingSecureRandom(intlength){

StringBuffer randStr=newStringBuffer(length);

SecureRandom secureRandom=newSecureRandom();

for(inti=;i<length;i++)

randStr.append(CHAR_LIST.charAt(secureRandom.nextInt(CHAR_LIST.length())));

returnrandStr.toString();

}

publicstaticvoidmain(Stringa){

RandomStringGeneratorMain rsgm=newRandomStringGeneratorMain();

System.out.println(«Generating String of length 10: «+rsgm.generateRandomStringUsingSecureRandom(10));

System.out.println(«Generating String of length 10: «+rsgm.generateRandomStringUsingSecureRandom(10));

System.out.println(«Generating String of length 10: «+rsgm.generateRandomStringUsingSecureRandom(10));

System.out.println(«Generating String of length 8: «+rsgm.generateRandomStringUsingSecureRandom(8));

System.out.println(«Generating String of length 8: «+rsgm.generateRandomStringUsingSecureRandom(8));

System.out.println(«Generating String of length 8: «+rsgm.generateRandomStringUsingSecureRandom(8));

System.out.println(«Generating String of length 7: «+rsgm.generateRandomStringUsingSecureRandom(7));

System.out.println(«Generating String of length 7: «+rsgm.generateRandomStringUsingSecureRandom(7));

System.out.println(«Generating String of length 7: «+rsgm.generateRandomStringUsingSecureRandom(7));

}

}
 

Output:

Generating String of length 10: Hz0hHRcO6X
Generating String of length 10: wSnjx6HNlv
Generating String of length 10: 4Wg9Iww0Is
Generating String of length 8: EdJmSrfC
Generating String of length 8: dAifHyQG
Generating String of length 8: HNnxieWg
Generating String of length 7: hQrqQ2L
Generating String of length 7: 0BWBtYI
Generating String of length 7: 3WStHON

Generate Random Numbers within range

All the above techniques will simply generate random number but there is no range associated with it, let’s now try to generate random numbers within range

1. Using Math.random()

Math.random() generates the random between 0.0 and 1.0 and if suppose you want to generate the random number between 10 and 25, then we need to do the below tweaks.

min + (int) (Math.random() * ((max – min) + 1))

  • In order to get the specific range of values, we need to multiply it with the difference range, which will be Math.random() * ( 25 – 10), this would return the values within the range of (15 is excluded)
  • Now, add the min range, so that the generated random will not be less than min.

min + (Math.random() * (max – min)) —> 10 + (Math.random() * (15))

Since the max range is excluded we just need to add 1 to make it inclusive.

min + (Math.random() * ((max – min) + 1)) —> 10 + (Math.random() * (16))

Math.random() generates random as a double value, in order to truncate the decimal part just cast it to int

min + (int) (Math.random() * ((max – min) + 1)) —> 10 + (int) (Math.random() * (16))

The code looks like below

public class RandomGenerator
{
	public static void main(String[] args)
	{
		int min = 10;
		int max = 25;
		System.out.println(min + (int) (Math.random() * ((max - min) + 1)));
	}
}

Output:

Run 1: 23

Run 2: 11

Run 3: 15

2. Using Random nextInt() method

The nextInt() of Random class has one more variant nextInt(int bound), where we can specify the upper limit, this method returns a pseudorandom between 0 (inclusive) and specified limit (exclusive).

Again a small tweak is needed.

min + random.nextInt(max – min + 1)

Difference between min and max limit and add 1 (for including the upper range) and pass it to the nextInt() method, this will return the values within the range of

random.nextInt(max – min + 1) —> random.nextInt(16)

Just add the min range, so that the random value will not be less than min range.

min + random.nextInt(max – min + 1) —> 10 + random.nextInt(16)

import java.util.Random;

public class RandomGenerator
{
	public static void main(String[] args)
	{
		int min = 10;
		int max = 25;

		Random random = new Random();
		System.out.println(min + random.nextInt(max - min + 1));
	}
}

3. Using Random ints() method

ints() method was introduced to Random Class in Java 8, this method returns unlimited stream of pseudorandom int values.

import java.util.Arrays;
import java.util.Random;

public class RandomGenerator
{
	public static void main(String[] args)
	{
		int min = 10;
		int max = 25;

		Random random = new Random();
		
		int[] numbers =  new Random().ints(min,max+1).limit(10).toArray();
		System.out.println(Arrays.toString(numbers));
	}
}

Since the ints() method  produces unlimited stream of random numbers, we might encounter OutOfMemoryError as the heap space will be full, with this in mind be sure to use the limit() method which limits the number of pseudorandom generated.

4. Using ThreadLocalRandom nextInt() method

ThreadLocalRandom class nextInt() method has the ability to take the min and max range.

public int nextInt(int least, int bound)

least – min range (inclusive)bound – max range (exclusive)

import java.util.concurrent.ThreadLocalRandom;

public class RandomGenerator
{
	public static void main(String[] args)
	{
		int min = 10;
		int max = 25;

		ThreadLocalRandom threadRandom = ThreadLocalRandom.current();
		System.out.println((int)threadRandom.nextDouble(min, max+1));
	}
}

5. Using RandomUtils

We should be having the Apache commons-lang3.jar in the classpath in order to use the RandomUtils.

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version></dependency>

The nextInt() method generates int random values, where the lower range is inclusive and upper range is exclusive.

import org.apache.commons.lang3.RandomUtils;

public class RandomGenerator
{
    public static void main(String[] args)
    {
        int min = 10;
        int max = 25;

        System.out.println(RandomUtils.nextInt(min, max+1));
    }
}

6. Using RandomDataGenerator

RandomDataGenerator needs Apache commons-math3.jar in the classpath. The RandomDataGenerator by default uses Well19937c generator for generating random numbers.

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-math3</artifactId> <version>3.6.1</version></dependency>

import org.apache.commons.math3.random.RandomDataGenerator;

public class RandomGenerator
{
	public static void main(String[] args)
	{
		// Both Upper and Lower are included
		RandomDataGenerator random = new RandomDataGenerator();
		System.out.println(random.nextInt(5, 10));
		
	}
}

Hope i have covered most of Java Random Number Generator, Do let me know if anything can be added.
Happy Learning !!

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

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

Adblock
detector