Используйте функции rand.Seed и rand.Int63 в пакете math/rand для генерации неотрицательного псевдослучайного числа типа int64:
rand.Seed(time.Now().UnixNano()) n := rand.Int63() // например 4601851300195147788
Аналогично, rand.Float64 генерирует псевдослучайное число с плавающей точкой x, где 0
x := rand.Float64() // например 0.49893371771268225
Предупреждение: без первоначального вызова rand.Seed вы будете получать одинаковую последовательность чисел при каждом запуске программы.
Несколько случайных источников
Все функции в пакете math/rand используют один случайный источник.
При необходимости вы можете создать новый генератор случайных чисел типа Rand со своим собственным источником, а затем использовать его методы для генерации случайных чисел:
generator := rand.New(rand.NewSource(time.Now().UnixNano())) n := generator.Int63() x := generator.Float64()
Целые числа и символы в заданном диапазоне
Число между a и b
Используйте rand.Intn(m), который возвращает псевдослучайное число n, где 0
n := a + rand.Intn(b-a+1) // a ≤ n ≤ b
Генератор случайных чисел и сила намерения
Символ между ‘a’ и ‘z’
c := ‘a’ + rune(rand.Intn(‘z’-‘a’+1)) // ‘a’ ≤ c ≤ ‘z’
Случайный элемент из среза
Чтобы сгенерировать символ из произвольного набора, выберите случайный индекс из среза символов:
chars := []rune(«AB⌘») c := chars[rand.Intn(len(chars))] // например ‘⌘’
- Go Code Review Comments: Пакет Crypto Rand
- Пакеты в Golang: объявление, импорт, загрузка, документирование
- Основы Go: базовые типы
Источник: golang-blog.blogspot.com
Случайные числа в стандартном си
Г енерация псевдослучайных чисел – это сложная математическая задача. Данная статья не ставит перед собой задачи охватить эту тему. Далее понятие «случайное число» будет означать псевдослучайное, если это не оговорено особо.
С примерами использования случайных чисел вы сталкиваетесь повсюду. Псевдослучайные числа используются в дизайне и графике, для генерации уровней в компьютерных играх и симулирования ИИ. Наборы случайных чисел используются в математических алгоритмах (см. Методы Монте-Карло).
Очевидно, что задача генерации случайных чисел на классическом процессоре не может быть решена, так как работа компьютера детерминирована по определению. Тем не менее, можно сгенерировать очень длинные наборы чисел такие, что их распределение будет иметь те же свойства, что и наборы истинно случайных чисел.
Важно, что для решения той или иной задачи необходимо правильно выбирать генератор, или как минимум знать его свойства. Например, при моделировании физического процесса можно получить совершенно разные и часто неверные результаты, в зависимости от выбора генератора случайных чисел.
Посмотрим стандартный генератор.
#include #include #include int main() < int i, r; srand(42); for (i = 0; i < 10; i++) < r = rand(); printf(«%dn», r); >_getch(); return 0; >
Для начала необходимо инициализировать генератор случайных чисел (ГСЧ, или RNG — random number generator), задать зерно – seed, на основе которого в дальнейшем будет происходить генерация. Важно, что для одного и того же начального значения генератор будет возвращать одни и те же числа.
rand. srand. rand задать диапазон. srand time null. Генератора случайных чисел. randomize. Урок #29.
srand(42);
Присваиваем переменной r случайное значение
r = rand();
Значение будет лежать в диапазоне от 0 до RAND_MAX.
Для того, чтобы при следующем запуске получить новый набор чисел, нужно инициализировать генератор каждый раз разными значениями. Например, можно использовать системной время:
srand(time(NULL));
srand(_getpid());
Функция getpid библиотеки process.h возвращает идентификатор процесса (можно также использовать getpid, не POSIX версию функции).
Центральная Предельная Теорема
Очень важно сразу напомнить или познакомить с центральной предельной теоремой. Неформальное определение – распределение суммы слабо зависимых случайных величин стремится к нормальному. Пальцеобразное объяснение: если сложить несколько случайных величин, независимо от их распределения, то распределение суммы будет нормальным. Часто можно увидеть такой код
#include #include #include int main() < int i, r, r1, r2, r3; srand(time(NULL)); r1 = rand(); r2 = rand(); r3 = rand(); r = (r1 + r2 + r3) / 3; printf(«%d», r); _getch(); return 0; >
Таким образом автор пытается сделать случайное число «более» случайным, но получает менее случайное число.
Генерация случайных чисел на заданном отрезке
Во-первых, получим случайное число от нуля до единицы:
const float RAND_MAX_F = RAND_MAX; float get_rand() < return rand() / RAND_MAX_F; >
Для получения числа в отрезке от нуля до N умножим N на случайное число от нуля до единицы. Для получения случайного числа от M До N, сдвинем полученное число на M.
float get_rand_range(const float min, const float max)
Для получения целого числа, будем брать остаток от деления на длину интервала. Но остаток от деления будет возвращать число на единицу меньше, чем наш интервал, поэтому увеличим его на единицу:
int get_rand_range_int(const int min, const int max)
Пример использования случайных чисел для вычисления интеграла. Пусть у нас есть некоторая гладкая функция от одной переменной. Ограничим её квадратом от a до b, и от 0 до некоторой точки, которая заведомо больше нашей функции.
Будем случайным образом кидать точки на нашем квадрате. Если они лежат выше функции (на рисунке изображены зелёными крестиками), то отнесём их к первой группе A, если ниже функции (на рисунке красные), то отнесём их ко второй группе B. Положение точек случайное и распределено равномерно (т.к. стандартный генератор даёт равномерное распределение. Этот простой пример, кстати, уже показывает, насколько важно знать свойства ГСЧ). Тогда отношение красных точек к общему числу точек будет равно отношению площади под графиком к общей площади. А общая площадь – это квадрат (b-a) на q.
Применим наши выкладки – найдём интеграл функции x^2 на отрезке от 0 до двух двумя способами.
#include #include #include #include #include const float RAND_MAX_F = RAND_MAX; float get_rand() < return rand() / RAND_MAX_F; >float get_rand_range(const float min, const float max) < return get_rand() * (max — min) + min; >#define ROUNDS 1000 float fun(float x) < return x * x; >float square_square(float a, float b, float q) < float h = (b — a) / (float)ROUNDS; float sum = 0; for (; a < b; a += h) < sum += fun(a) * h; >return sum; > float rand_square(float a, float b, float q) < float res; float x, y; int i; int lower = 0; float ratio; float square; srand(time(NULL)); for (i = 0; i < ROUNDS; i++) < x = get_rand_range(a, b); y = get_rand_range(0, q); res = fun(x); if (res >y) < lower++; >> ratio = (float)lower / (float)ROUNDS; square = (b — a) * q * ratio; return square; > int main()
Поиграйте со значением ROUNDS, измените его и посмотрите, как меняется точность вычислений.
Генерация истинно случайных чисел
Для генерации настоящих случайных чисел используют генераторы, основанные на каких-то случайных физических процессах. Например, на тепловых шумах, на подсчёте числа делений радиоактивного вещества, на атмосферных шумах и т.п. Недостаток таких генераторов – низкая скорость работы (количество сгенерированных чисел в секунду) ; конечно, такие генераторы обычно являются отдельным устройством.
Если есть необходимость в большом наборе истинно случайных чисел, можно воспользоваться таблицами случайных чисел, например на сайте RANDOM.ORG
Всё ещё не понятно? – пиши вопросы на ящик
Источник: learnc.info
Функция random, randomSeed Ардуино
Функция random Ардуино возвращает псевдослучайное число, то есть последовательность генерации случайных чисел все таки предсказуема. Функция randomSeed позволяет поместить переменную или константу в функцию random, чтобы генерировать более случайные значения. Разберемся в этой статье, как в языке программирования Arduino IDE задать рандомное число в диапазоне правильно.
random — генерация случайных чисел Ардуино
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega
Функция random (min, max) позволяет вернуть псевдослучайное число в диапазоне, заданном значениями min и max. Разберем примеры с разными типами данных.
Arduino random int
В представленном примере выбран тип данных byte, хранящий целые числа в диапазоне от 0 до 250. Можно использовать и другие типы данных: int, long, unsigned long, unsigned int и другие. Соответственно задается нужный диапазон (min, max).
byte data; void setup() < Serial.begin(9600); > void loop() < data = random(100, 200); // ардуино рандомное число в диапазоне Serial.println(data); delay(250); >
Arduino random float
Генерировать микроконтроллер может только целые числа. Поэтому чтобы получить тип данных float с двумя знаками после запятой, следует отдельно генерировать целое число и добавлять к нему десятичные дроби. Пример такой программы:
float data; float data1; float data2; void setup() < Serial.begin(9600); > void loop() < data1 = random(0, 10); // генерируем целые числа data1 = random(0, 100); // генерируем числа после запятой data = data1 + data2 / 100; // складываем полученные значения Serial.
println(data); delay(250); >
Arduino random bool
Если нужна случайная переменная boolean, которая может принимать только два значения true или false. То можно генерировать случайное true/false с заданной вероятностью. Просто присваиваем переменной bool результат функции random, в которой указываем число, обратное вероятности получения false. Пример:
bool data; void setup() < Serial.begin(9600); > void loop() < data = random(5); // переменная data получит значение 0 с вероятностью 1/5 Serial.println(data); delay(250); >
Случайные числа Ардуино randomSeed
Обратите внимание, что во всех примерах, представленных выше, при каждом перезапуске программы случайная последовательность чисел повторяется. Этого можно избежать, используя функцию randomSeed Arduino. randomSeed позволяет поместить переменную в функцию random. Для этого используют millis, analogRead или другие варианты, позволяющие сделать генерацию чисел более случайной.
int data; void setup() < Serial.begin(9600); randomSeed(analogRead(A1)); // к пину A1 ничего не подключается > void loop() < data = random(100, 200); // ардуино рандомное число в диапазоне Serial.println(data); delay(250); >
При каждом перезапуске программы генератор псевдослучайных чисел будет инициализироваться функцией randomSeed(analogRead(A1)); со случайного значения из-за «шума» на порту. Можно использовать любой свободный порт для этого, так как все аналоговые выводы воспринимают случайный шум из окружающей среды — радиоволны, электромагнитные помехи от компьютеров, сотовых телефонов и т.д.
Источник: xn--18-6kcdusowgbt1a4b.xn--p1ai