Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Странный такой генератор случайных чисел...  (Прочитано 4222 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн inkblack

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Код: (c) [Выделить]
#include <stdio.h>
#include <stdlib.h>

int main(void)  {
 unsigned int seed=2147483647;
 int count;

 srandom(seed);

 for (count=0; count<40; count++) {
  printf( "%ld\n", random() );
 }
 return 0;
}

Результат:
Код: (c) [Выделить]
1065668062
2142264300
1066566375
1064012770
2141034222
1065509725
2135810236
2139491828
2138030783
2133535487
1063823214
1062867731
1057142398
1061426218
2134940760
2127804915
2132199267
2132963510
1050498024
2128539129
2130599457
2120124065
2124047555
1054006513
2115383933
1044819428
2124282634
1036193370
2111890717
1046299399
2103680308
1030075131
1041080051
1022763035
2094087902
1034630625
2088272761
2082414490
1026638805
2078819896

График (не 40, а 140 чисел) не оставляет сомнений: :idiot2:


Я фшоке.

А вы?

P.S. А я ещё Сеньору Гаге выговаривал за то, что он самописные ГСЧ тут продвигал...
Прости меня, Шляпа...
Делюсь знаниями, но их у меня мало!

Оффлайн absent

  • Активист
  • *
  • Сообщений: 368
  • Ubuntu 16.04
    • Просмотр профиля
это ведь псевдослучайная последовательность (тем более от запуска к запуску она будет повторяться согласно фиксированному srandom(seed)). для почти случайной наверное надо что-то наподобие srandom(time(0))

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
inkblack, /dev/random более случайные результаты по идее должен возвращать, хотя конечно тоже псевдослучайные.
Вот пример:

Получал таким скриптом:
Код: (bash) [Выделить]
#!/bin/bash
i=0
while [ $i -lt 200 ]
do
  head -c1 /dev/urandom | hexdump -d | sed -E '1!d;s/.+ +0+//'
  i=$[$i+1]
done
« Последнее редактирование: 04 Июля 2013, 14:31:06 от peregrine »

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net

Код: (bash) [Выделить]
$ for I in {1..99} ; do echo $RANDOM ; done
$ bash --version
GNU bash, version 4.2.45(1)-release (x86_64-redhat-linux-gnu)

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
ArcFi, ходят слухи, что $RANDOM - это псевдослучайный генератор BASH (использует сложный алгоритм, но не самый), а /dev/urandom, как и /dev/random более сложные алгоритмы (правда ли это?)

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
/dev/random использует для генерации всякую стохастическую информацию (движение мыши, температуру процессора и т.п.) но беда в том что этой информации можно собрать не так много в единицу времени и /dev/random может заткнутся в ожидании очередной порции такой информации.
Именно этот затык лечит /dev/urandom - он дает непрерывную (во времени) последовательность, которая при возможности генерируется из стохастических данных, а при их отсутствии используется псевдослучайный генератор. 

$RANDOM - просто псевдослучаный генератор.
« Последнее редактирование: 04 Июля 2013, 21:10:34 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Собственно "случайность"чисел важна для шифрования (при генерации ключей) там важно что бы не было никакой статистической зависимости между сериями чисел. Т.е. не должно быть регулярно повторяющейся последовательности чисел. А псевдо случайные (даже очень навороченные) всегда имеют цикл (у навороченных он просто больше чем 2^n (где n - число разрядов генерируемого числа). У самого простого генератора с обратными связями этот цикл равен 2^n-1, и есть одно недостигаемое значение (оно же - циклическое, т.е. если им инициализировать генератор, то он никогда ничего другого и не выдаст).
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
peregrine,
Цитата: bash-4.2.45-1.fc19.src/bash-4.2/variables.c
/* A linear congruential random number generator based on the example
   one in the ANSI C standard.  This one isn't very good, but a more
   complicated one is overkill. */

/* Returns a pseudo-random number between 0 and 32767. */

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Sly_tom_cat, ArcFi спасибо за объяснение.

Оффлайн inkblack

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Ребят, вы не поняли...

Если в моём примере взять seed другой —  0,  или  1,  или  2147483646,  или  2147483648,
всё будет в порядке. Про  /dev/random  и  /dev/urandom  я тоже знаю. И про линейный
конгруэнтный метод.

Кстати, ЛКМ, при всех его недостатках, выдаёт всё-таки псевдослучайные числа, а не ту
порнографию, которую мы видим здесь.

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

Проблема в том, что в стандартной библиотеке оказалась такая лажа  :idiot2:

И это через 50 лет после  RANDU...

Повторяю, я фшоке.



peregrine, кстати, если, как пишет нам ArcFi, в баше используется
«A linear congruential random number generator», то это не «сложный алгоритм»,
а простейший, тем более, если он выдаёт числа «between 0 and 32767». Тем не менее,
получаемые числа должны быть довольно качественными, при правильных параметрах
генератора.
« Последнее редактирование: 05 Июля 2013, 01:41:41 от inkblack »
Делюсь знаниями, но их у меня мало!

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
inkblack, так репортить баг надо. Что шокироваться?  :idiot2:

Дело понятное - гдет-то кто-то накосячил. Надо фиксить.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн MuadDlb

  • Участник
  • *
  • Сообщений: 147
  • The Dune Messiah
    • Просмотр профиля
Одна из реализаций генератора псевдослучайных чисел. В инете легко можно найти алгоритмы для каждой библиотеки и понять почему так.

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

Оффлайн inkblack

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
inkblack, так репортить баг надо. ...

Ну да, вот занимаюсь...
Делюсь знаниями, но их у меня мало!

Оффлайн reggisterer

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
    • Рекламный сайт
Re: Странный такой генератор случайных чисел...
« Ответ #13 : 29 Августа 2013, 18:05:31 »
мда...

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Странный такой генератор случайных чисел...
« Ответ #14 : 05 Ноября 2013, 03:19:25 »
Вообще очень плохой генератор псевдослучайных чисел. Запусти программу несколько раз, он одно и то же вернёт, с любым значением. Это напоминает мне такое:
Код: (cpp) [Выделить]
//main.cpp
#include <iostream>

int main()
{
    std::cout<<"Выведем пять случайных чисел на экран"<<std::endl;
    std::cout<<153<<" "<<65<<" "<<962<<" "<<36<<" "<<451<<std::endl;//Честно, я выбирал случайные числа, какие мне пришли в голову.
    return 0;
}

 

Страница сгенерирована за 0.037 секунд. Запросов: 24.