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


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

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

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

Оффлайн inkblack

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Код: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)  {
  5.  unsigned int seed=2147483647;
  6.  int count;
  7.  
  8.  srandom(seed);
  9.  
  10.  for (count=0; count<40; count++) {
  11.   printf( "%ld\n", random() );
  12.  }
  13.  return 0;
  14. }
  15.  

Результат:
Код: C
  1. 1065668062
  2. 2142264300
  3. 1066566375
  4. 1064012770
  5. 2141034222
  6. 1065509725
  7. 2135810236
  8. 2139491828
  9. 2138030783
  10. 2133535487
  11. 1063823214
  12. 1062867731
  13. 1057142398
  14. 1061426218
  15. 2134940760
  16. 2127804915
  17. 2132199267
  18. 2132963510
  19. 1050498024
  20. 2128539129
  21. 2130599457
  22. 2120124065
  23. 2124047555
  24. 1054006513
  25. 2115383933
  26. 1044819428
  27. 2124282634
  28. 1036193370
  29. 2111890717
  30. 1046299399
  31. 2103680308
  32. 1030075131
  33. 1041080051
  34. 1022763035
  35. 2094087902
  36. 1034630625
  37. 2088272761
  38. 2082414490
  39. 1026638805
  40. 2078819896

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


Я фшоке.

А вы?

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

Оффлайн absent

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

Оффлайн peregrine

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

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

Оффлайн ArcFi

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

Код: Bash
  1. $ for I in {1..99} ; do echo $RANDOM ; done
  2. $ bash --version
  3. GNU bash, version 4.2.45(1)-release (x86_64-redhat-linux-gnu)

Оффлайн peregrine

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

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12075
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
/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 - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12075
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Собственно "случайность"чисел важна для шифрования (при генерации ключей) там важно что бы не было никакой статистической зависимости между сериями чисел. Т.е. не должно быть регулярно повторяющейся последовательности чисел. А псевдо случайные (даже очень навороченные) всегда имеют цикл (у навороченных он просто больше чем 2^n (где n - число разрядов генерируемого числа). У самого простого генератора с обратными связями этот цикл равен 2^n-1, и есть одно недостигаемое значение (оно же - циклическое, т.е. если им инициализировать генератор, то он никогда ничего другого и не выдаст).
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://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
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7172
  • 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!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12075
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
inkblack, так репортить баг надо. Что шокироваться?  :idiot2:

Дело понятное - гдет-то кто-то накосячил. Надо фиксить.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://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
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7172
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Странный такой генератор случайных чисел...
« Ответ #14 : 05 Ноябрь 2013, 03:19:25 »
Вообще очень плохой генератор псевдослучайных чисел. Запусти программу несколько раз, он одно и то же вернёт, с любым значением. Это напоминает мне такое:
Код: C++
  1. //main.cpp
  2. #include <iostream>
  3.  
  4. int main()
  5. {
  6.     std::cout<<"Выведем пять случайных чисел на экран"<<std::endl;
  7.     std::cout<<153<<" "<<65<<" "<<962<<" "<<36<<" "<<451<<std::endl;//Честно, я выбирал случайные числа, какие мне пришли в голову.
  8.     return 0;
  9. }
  10.  

 

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