Случайные числа в стандартном си

Содержание:

Функции rand() и srand()

В языках программирования обычно предусмотрены функции, позволяющие генерировать случайные числа в определенном по умолчанию диапазоне. На самом деле генерируются не случайные, а так называемые псевдослучайные числа; они выглядят случайно, но вычисляются по вполне конкретной формуле. Но для простоты далее мы все равно будем называть их случайными.

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

Напишите программу, в которой целочисленной переменной присваивается результат выполнения функции . Выведите значение переменной на экран.

Функция возвращает целое число от 0 до значения присвоенного константе RAND_MAX. Значение RAND_MAX зависит от системы и определено в заголовочном файле stdlib.h. Так, например, оно может быть равно 32767 (двухбайтовое целое) или 2147483647 (четырехбайтовое целое).

Определите значение RAND_MAX в вашей системе. Для этого не забудьте подключить к файлу исходного кода заголовочный файл stdlib.h.

Код ниже выводит на экран 50 случайных чисел:

#include <stdio.h>
#include <stdlib.h>
 
int main () {
    char i;
 
    for (i = 1; i <= 50; i++) {
        printf("%15d", rand());
        if (i % 5 == ) printf("\n");
    }        
}

В теле цикла осуществляется переход на новую строку после каждых выведенных на экран пяти чисел. Для этого используется выражение, в котором находится остаток от деления i на 5, результат сравнивается с 0. Чтобы после первого числа не происходил переход на новую строку, iсначала присваивается единица, а не ноль (т.к. 0 делится на 5 без остатка).

Спишите код, приведенный выше

Выполните программу несколько раз, при этом обратите внимание, разные ли результаты вы получаете от выполнения к выполнению

Вы должны были заметить, что при каждом запуске программы числа остаются одинаковыми. Даже если вы перекомпилируете программу, результат не изменится. Данный эффект связан с тем, что начальное (инициализирующее) число, которое подставляется в формулу вычисления первого и последующих псевдослучайных чисел, для каждой системы всегда одно и то же. Однако это начальное число можно изменить с помощью функции , которой в качестве параметра передается любое целое число. Понятно, что если вы зададите конкретный аргумент для функции, например, , то от вызова к вызову программы числа будут также одни и те же. Хотя и не те, что были бы без . Поэтому появляется проблема, как сделать так, чтобы аргумент для был тоже случайным? Получается замкнутый круг.

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

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

Текущее время можно узнать с помощью функции , прототип которой описан в файле time.h. Передав в качестве параметра NULL, мы получим целое число, которое можно передать в :

srand(time(NULL));

Переделайте вашу программу так, чтобы инициализирующее значение зависело от системного времени.

Генератор случайных чисел с помощью Анализа данных

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

Пример генерации случайных чисел нормального распределения

Для того чтобы сгенерировать случайные числа нормального распределения, переходим во вкладку « ДАННЫЕ », в группе « Анализ » выбираем « Анализ данных ».

Генератор случайных чисел в Excel – Анализ данных

В открывшемся списке выбираем «Генерация случайных чисел» и нажимаем кнопку « ОК ».

Генератор случайных чисел в Excel – Генерация случайных чисел

В открывшемся окне в списке «Распределение» выбираем «Нормальное», вводим число переменных, число случайных чисел, среднее и отклонение, а также место, где вы хотите разместить сгенерированные случайные числа.

Генератор случайных чисел в Excel – Генерация случайных чисел нормального распределения

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

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

У нас есть последовательность чисел, состоящая из практически независимых элементов, которые подчиняются заданному распределению. Как правило, равномерному распределению.

Сгенерировать случайные числа в Excel можно разными путями и способами. Рассмотрим только лучше из них.

Алгоритм произвольного выбора

Часто возникает задача произвольного выбора ранее заданных элементов массива. Причем необходимо предусмотреть отсутствие повторений в выборе этих элементов.
Алгоритм такого выбора состоит в следующем:

  • Выбираем произвольно индекс элемента массива
  • Если элемент с таким индексом уже был ранее выбран, двигаемся вправо, пока не дойдём до следующего не выбранного элемента. При этом следим за тем, чтобы «движение вправо» не вышло за границы массива. Если фиксируется выход за границы массива, начинаем просмотр элементов массива с начала.
  • Выбираем элемент
  • Фиксируем элемент как выбранный
  • Повторяем указанные действия для всех остальных элементов

 Реализации на Си
В результате получаем новый массив b, сформированный произвольной выборкой элементов массива a.

123456789101112131415161718192021222324252627282930313233

#include <stdio.h>#include <stdlib.h>#include <time.h>#define SIZE 20int main() {  int a;  int b; // результирующий массив  srand(time(NULL));  // Заполняем массив последовательными значениями от 1 до 20  for (int i = 0; i < SIZE; i++)  {    a = i + 1;    printf(«%2d «, a);  }  for (int i = 0; i < SIZE; i++)  {    int ind = rand() % 20; // выбираем произвольный индекс    while (a == -1) // пока элемент «выбран»    {      ind++;       // двигаемся вправо      ind %= 20;     // если дошли до правой границы, возвращаемся в начало     }    b = a;    // записываем следующий элемент массива b    a = -1;    // отмечаем элемент массива a как «выбранный»  }  printf(«\n»);  // Выводим получившийся массив  for (int i = 0; i < SIZE; i++)    printf(«%2d «, b);  getchar();  return 0;}

Алгоритмизация

Получение вещественных случайных чисел

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

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

Если разделить случайное число, преобразованное к вещественному типу, которое выдала функция , на значение константы RAND_MAX, то получится вещественное случайное число от 0 до 1. Теперь, если это число умножить на длину диапазона, то получится число, лежащее в диапазоне от 0 до значения длины диапазона. Далее если прибавить к нему смещение к минимальной границе, то число благополучно впишется в требуемый диапазон. Таким образом формула для получения случайного вещественного числа выглядит так:

(float) rand()  RAND_MAX * (max - min) + min

Заполните массив случайными числами в диапазоне от 0.51 до 1.00. Выведите значение элементов массива на экран.

Равновероятные случайные числа

Функция генерирует любое случайное число от 0 до RAND_MAX с равной долей вероятности. Другими словами, у числа 100 есть такой же шанс выпасть, как и у числа 25876.

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

#include <stdio.h>
#include <time.h>
 
#define N 500
 
int main () {
    int i;
    int arr5 = {};
 
    srand(time(NULL));
 
    for (i=; i < N; i++)   
        switch (rand() % 5) {
            case  arr++; break;
            case 1 arr1++; break;
            case 2 arr2++; break;
            case 3 arr3++; break;
            case 4 arr4++; break;
    }
 
    for (i=; i < 5; i++) 
        printf("%d - %.2f%%\n", i, 
              ((float) arri  N) * 100);
}

В приведенной программе массив из пяти элементов сначала заполняется нулями. Случайные числа генерируются от 0 до 4 включительно. Если выпадает число 0, то увеличивается значение первого элемента массива, если число 1, то второго, и т.д. В конце на экран выводится процент выпадения каждого из чисел.

Спишите данную программу. Посмотрите на результат ее выполнения при различных значениях N: 10, 50, 500, 5000, 50000. Объясните увиденное.

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

Генерация случайных распределений и псевдослучайных чисел в Python.

Модуль реализует генераторы псевдослучайных чисел для различных распределений.

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

На реальной линии есть функции для вычисления равномерного, нормального (гауссовского), логнормального, отрицательного экспоненциального, гамма и бета распределений. Для генерации распределений углов доступно распределение фон Мизеса.

Почти все функции модуля зависят от базовой функции , которая генерирует случайное число с плавающей точкой в ​​полуоткрытом диапазоне . Python использует Mersenne Twister в качестве генератора ядра. Он генерирует 53-битные значения точности и имеет период . Базовая реализация в C является быстрой и поточно-ориентированной. Mersenne Twister является одним из наиболее тщательно протестированных генераторов случайных чисел из существующих. Однако, будучи полностью детерминированным, он не подходит для всех целей и совершенно не подходит для криптографических целей.

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

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

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

Предупреждение.

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

Замечания по воспроизводимости последовательностей.

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

Большинство алгоритмов и функций модуля могут изменяться в разных версиях Python, но два аспекта гарантированно не изменятся:

  • Если будет добавлен новый метод, то обязательно будет предложена обратная совместимость.
  • Метод генератора будет продолжать создавать ту же последовательность, если совместимому методу будет дано то же самое начальное число .

Распределения

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

Все они принимают в качестве аргументов в конструкторе либо параметры другого распределения, либо переменные, отвечающие за диапазон значений. Если оные не указаны, то используется диапазон от 0 до максимального значения, определенного в numeric_limits<>::max() данного идентификатора типа, являющегося параметром шаблона.

Если указан лишь один аргумент, то берется диапазон значений от данного до максимального. Следует отметить, что границы также учитываются, т.е. при указании в качестве аргументов a, b используется диапазон .

Оператор () принимает в качестве параметра генератор и возвращает число из диапазона распределения. При этом на одно и то же распределение можно применять совершенно различные генераторы, отвечают они лишь за диапазон.

Как использовать модуль 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 давайте рассмотрим основные сферы их применения.

Вопрос 1. Что такое случайные числа?

Сложность: 1/3

Что нужно помнить: случайные числа — это математическое понятие, и их не следует путать с обыденными, произвольными числами. Случайное число в математике и программировании — это:

  • число из определённого диапазона,
  • у которого есть определённая вероятность выпадения.

Другими словами, существует закон или правило, которое называется «функцией распределения» или просто «распределением». И это самое распределение «раздаёт» каждому числу из диапазона определённую вероятность выпадения.

В качестве диапазона значений математикам и программистам привычнее всего использовать диапазон действительных чисел от 0 до 1, но это могут быть и целые числа от 1 до 6, как в игральном кубике, или от 100 до 1 000 000 — и так далее. Главное, что и распределение, и диапазон известны заранее, а само число нет.

Итого: случайные числа — это искусственно полученная последовательность чисел из определённого диапазона, которая подчиняется одному из законов распределения случайной величины.

Приём №2: отбрасываем неподходящее значение

Если предыдущую программу запустить несколько раз, то рано или поздно у вас возникнет ситуация, когда одно и то же имя было выведено дважды. Что, если вам нужно уникальное значение, не выпадавшее прежде за время запуска программы?

Тогда используйте цикл, чтобы запрашивать случайные значения до тех пор, пока очередное значение не попадёт под ваши требования. Будьте аккуратны: если требования нереалистичные, вы получите бесконечный цикл!

Доработаем программу, добавив цикл while в функцию main. Для сохранения уже использованных имён воспользуемся структурой данных std::set из заголовка , представляющей динамическое множество.

Получение целых случайных чисел в заданных диапазонах

Функция выдает случайное число от 0 до значения RAND_MAX. Что делать, если требуется получать случайные числа в иных диапазонах, например, от 100 до 999?

Сначала рассмотрим более простую ситуацию: получить случайные числа от 0 до 5. Если любое целое число попытаться разделить на 5 нацело, то в качестве остатка можно получить как 0 (когда число делится на 5 без остатка), так и 1, 2, 3, 4. Например, вернула число 283. Применяя к этому числу операцию нахождения остатка от деления на 5, получим 3. Т.е. выражение дает любое число в диапазоне [0, 5).

Однако, что если надо, чтобы число 5 так же входило в диапазон, т.е. диапазон имеет вид ? Логично предположить, что следует найти остаток от деления на 6. При этом более грамотным будет следующее рассуждение: надо находить остаток от деления на размер диапазона. В данном случае он равен шести значениям: 0, 1, 2, 3, 4, 5. Чтобы найти размер диапазона, надо из допустимого максимума вычесть допустимый минимум и прибавить единицу: max — min + 1. Будьте внимательны: если, например, требуется, чтобы указанный в задаче максимум не входил в диапазон, то единицу прибавлять не надо или надо вычитать единицу из максимума.

Напишите программу, выдающую 50 случайных чисел от 0 до 99 включительно.

Итак, мы знаем формулу получения длины диапазона: max — min + 1. Если требуется получить число от 6 до 10 включительно, то длина диапазона будет равна 10 — 6 + 1 = 5. Выражение даст любое число от 0 до 4 включительно. Но нам надо от 6 до 10. В таком случае достаточно к полученному случайному остатку прибавить 6, т.е. минимум. Другими словами, надо выполнить сдвиг. Действительно для приведенного примера:

  • если остаток был равен 0, то добавляя 6, получаем 6;
  • остаток 1, добавляем 6, получаем 7;
  • остаток 4, прибавляем 6, получаем 10;
  • остатка больше 4 не может быть.

В таком случае формула для получения случайного числа в диапазоне выглядит так:

rand() % длина_диапазона + сдвиг

где длина_диапазона вычисляется как b — a + 1, сдвиг является значением a.

В эту формулу также вписываются случаи, когда необходимо получить случайное число от 0 до N, т.е. они являются ее частными случаями.

Выведите на экран ряд случайных чисел, принадлежащих диапазону от 100 до 299 включительно.

С таким же успехом можно получать случайные отрицательные числа. Действительно, если диапазон задан как , то его длина будет равна -1 — (-35) + 1 = 35, что соответствует действительности; выражение получения случайного числа будет выглядеть так:

rand() % 35 - 35 

Так, если остаток от деления составил 0, то мы получим -35, а если 34, то -1. Остальные остатки дадут значения в промежутке от -35 до -1.

Выведите на экран ряд случайных чисел, принадлежащих диапазону от -128 до 127 включительно.

main.cpp

А теперь применение

#include <QCoreApplication>

#include "Random.hpp"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    std::cout << "Random STD  - ";
    for (int i = 0; i < 15; ++i)
    {
        std::cout << Random::get(15, 43) << " ";
    }
    std::cout << std::endl;
    return a.exec();
}

Вывод

Random STD  - 38 29 36 38 21 32 33 39 31 15 33 16 36 38 35

В данном случае мы действительно получим случайный вывод чисел, а также числа не будут повторяться при каждом запуске программы. Что касается случайности, то я убедился в этом лично, когда для генерации уровня в игре применил данный класса Random. Каждый раз расстановка объектов в игре не повторялась. Чего очень сложно было достичь с использованием qrand .

Так что из ништяков C++11 можно выделить достаточно качественную генерацию псевдослучайных чисел.

Число отношения

       Ваше число отношения — это то, как вы подходите к жизни и то, что вы отдаете другим. Думайте о своем числе отношения как о том, как лично вы справляетесь с жизнью. Чтобы узнать свое число отношения сложите вместе день рождения и месяц рождения. Например, вы родились 4 июня: 4+6=10, 1+0=1. Число отношения для даты рождения 4 июня равно 1.

Число отношения 1 

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

Число отношения 2 

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

Число отношения 3

       Вы очень молоды душой. Из-за вашего энтузиазма и детского удивления люди часто думают, что вы моложе, чем вы есть на самом деле. Ваше настроение настолько влиятельно, что вы можете заражать им других — как позитивно, так и негативно. К счастью, ваше плохое настроение длится не долго.

Число отношения 4 

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

Быть организованным важно для вашего благополучия

Число отношения 5

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

Число отношения 6 

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

Число отношения 7 

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

Число отношения 8 

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

Число отношения 9

       Ваш девиз по жизни: «Как я могу помочь другим?» Вы гуманный и сострадательный лидер. Вы хотите сделать мир лучше. Вы были бы отличным активистом из-за вашего социально-ориентированного сознания и способности вести других за собой. Позвольте вашему щедрому сердцу вести вас по жизни.

Генерация случайных чисел в заданном диапазоне

Существует несколько способов генерации случайного (псевдослучайного) числа:

  1. Использование метода random() из класса математических функций Math , находящемся в пакете java.lang.
  1. Использование метода random() из класса Random , находящемся в пакете java.util.Random.
  1. Использование генератора случайных чисел класса SecureRandom , предназначенного для целей криптографии и, находящегося в пакете java.security. SecureRandom (здесь не рассматривается).

Рассмотрим методы генерации случайных чисел.

Класс Math. Метод random()

Метод random() класса Math возвращает псевдослучайное число типа double в диапазоне 0 ≤ Math.random()

Пример 1. Несколько случайных чисел

Случайное число № 1: 0.9161994380531232 Случайное число № 2: 0.24340742865928744 Случайное число № 3: 0.9783627451986034

Пример 2. Случайное число x в диапазоне a ≤ x ≤ b

Для генерации целого случайного числа x в заданном диапазоне a ≤ x ≤ b, обычно используется следующая зависимость:

x = a + (int)(Math.random()*((b — a) + 1)).

Получим случайное число x в диапазоне: 10 ≤ x ≤ 20 (a=10, b=20).

Результат.Случайное число x: 19

Класс Random. Метод random()

Это наиболее часто используемый класс для генерации псевдослучайный чисел с равномерной функцией распределения. Имеется метод nextGaussian() , который моделирует функцию нормального распределения.

Основными методами этого класса являются:

  • int nextInt( ) — возвращает следующее случайное значение ix типа int в диапазоне -2147483648 ≤ ix
  • int nextInt(int n) — возвращает следующее случайное значение ix типа int в диапазоне 0 ≤ ix
  • float nextFloat() — возвращает следующее случайное значение fx типа float в диапазоне 0.0 ≤ fx
  • double nextDouble() — возвращает следующее случайное значение dx типа double в диапазоне 0.0 ≤ dx
  • boolean nextBoolean() — возвращает следующее случайное значение типа boolean
Для получения случайных чисел необходимо:
  1. Подключить библиотеку случайных чисел. Пишем до определения класса. import java.util.Random;
  2. В классе создать объект rand случайных чисел Random rand = new Random();
  3. Далее использовать необходимые методы объекта rand.

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

Случайное число ix: 1438841988 Случайное число dx: 0.6120986135409442 Случайное число fx: 0.103119016 Случайное число bx: true

Пример 2. Случайное число x в диапазоне a ≤ x ≤ b.

Для генерации целого случайного числа x в заданном диапазоне a ≤ x ≤ b, обычно используется следующая зависимость:

тип int int x = a + rand.nextInt(b — a + 1).

тип double double y = a + rand.nextInt(b — a).

Случайное число x: 12 Случайное число dx: 17.505847041626733

Для типа double будет выведено случайное число в виде:

что неудобно. Для приемлемого представления используется форматный вывод, позволяющий выводить числа с заданной точностью.

Форматный вывод

Пакет java.io содержит класс PrintStream , который содержит методы printf и forma t, позволяющие выводить числа с заданной точностью. Рассмотрим метод format(). Синтаксис метода

System.out.format(String format, Object. args),

format — это строка — шаблон, согласно которому будет происходить форматирование, args — это список переменных, для вывода по заданному шаблону.

Строка — шаблон содержит обычный текст и специальные форматирующие символы. Эти символы начинаются со знака процента (%) и заканчиваются конвертором — символом, который определяет тип переменной для форматирования. Вот некоторые конверторы:

Источник

Вступление

Но мы ведь пишем на плюсах. В 11 стандарте С++ для программистов предоставляются обширные возможности для создания ГЧ и их использования. Надо отметить, что ничего нового не придумали, а добавили классы из библиотеки boost (boost/random). Так что для тех, кто не может пользоваться свежим компилятором, всегда есть вариант с использованием данной библиотеки.

В связи с чем возникла потребность новых ГСЧ? Если вы пишите проекты чуть более сложные, чем Hello World, то «случайности» ГСЧ (а правильнее ГПСЧ) srand вам попросту не хватит, несложно будет вычислить порядок следования последовательности, и вызов будет происходить в одно и то же время, давая одинаковый результат. Также, само по себе использование srand неудобно, все хорошо лишь при диапазоне от 0 до n, вдобавок n ограничен потолком short int на некоторых системах. А если надо брать нижнюю границу, отличную от 0, то появляются лишние числа, вычисления, влекущие ошибки, связанные с неверным подсчетом. Еще хуже дело обстоит с генерацией СЧ в виде числа с плавающей точкой. И рассмотренные ниже классы помогут нам в этом нелегком пути. Пусть вас не пугают длинные непривычные названия, попробовав новый функционал, вы будете даже простые задачки решать с его помощью.

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

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

Adblock
detector