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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: rand() вправду ли генерирует случайное число?  (Прочитано 1288 раз)

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

Оффлайн solyr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
У меня вот вопрос возник ф-я rand() и вправду ли генерирует случайное число. Скажем имеется код который должен получать случайное число в диапазоне от 0 до 9 rand()%10 Я его получаю и анализирую Возникает странная проблема, если я запускаю несколько копий этой программы то почему то все копии генерируют туже самую последовательность чисел при помощи ф-ии rand() что и в других копиях. Хотелось бы и в правду получать случайное число в некотором диапазоне для какой то определенной копии. Это мне получается самому надо разрабатывать функцию которая и в правду работала бы с математической вероятностью И будет ли эта вероятность реальной вероятностью при использовании ф-ии rand() если алгоритм работы будет одинаковым ? Откуда такая закономерность при генерации случайного числа?
« Последнее редактирование: 05 Декабрь 2009, 07:32:48 от solyr »

Оффлайн grampe

  • Любитель
  • *
  • Сообщений: 51
  • formspring me!
    • Просмотр профиля
Re: rand() вправду ли генерирует случайное число?
« Ответ #1 : 05 Декабрь 2009, 08:17:59 »
когда я прогал на делфи там была фигня randomize которую надо было запускать как тут не знаю так что поищи что нить подобное)))

Пользователь решил продолжить мысль 05 Декабрь 2009, 08:18:07:

Lifewalker

  • Гость
Re: rand() вправду ли генерирует случайное число?
« Ответ #2 : 05 Декабрь 2009, 08:20:48 »
Отродясь функции типа rand() во всех языках генерили псевдослучайную последовательность чисел. И последовательность эта повторяющаяся. Алгоритмам создания псевдослучайных чисел и максимизации их ряда посвящены диссертации. Как бы то ни было, не думаю, что кто-то придумал алгоритм создания действительно случайных чисел, в смысле реально случайных, с совершенно равномерным распределением по ряду. Инфу по алгоритмам, думаю, можно поискать в гугле :)
« Последнее редактирование: 05 Декабрь 2009, 08:23:16 от Lifewalker »

Оффлайн solyr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: rand() вправду ли генерирует случайное число?
« Ответ #3 : 05 Декабрь 2009, 08:27:25 »
Пришлось каждый раз когда необходимо случайное число устанавливать начальное значение счетчика случайных чисел в зависимости от времени запуска генератора.

   srand(time(NULL)|clock());
   position = rand()%10; //генерируем случайное число 0 до 9

Тогда при запуске различных копий и в псевдоправду получаем случайные числа ) которые были так необходимы

Неее до дисертаций в этой области огого Мне так, просто надо было для насущных проблем Заоблачную математику случайных чисел оставим людям посвященным

Lifewalker

  • Гость
Re: rand() вправду ли генерирует случайное число?
« Ответ #4 : 05 Декабрь 2009, 08:34:23 »
Что же, это выход. Кстати, где-то давно-давно мелкала у меня перед глазами информация что где-то в каком-то языке именно такой метод и используется прямо внутри rand(). Откровенно говоря, давно не программирую и не слежу за подобными вещами. Думал, везде уже "искаропки" сделано через таймер+генератор :)

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: rand() вправду ли генерирует случайное число?
« Ответ #5 : 08 Декабрь 2009, 12:07:45 »
Рекомендую Mersenne-Twister random generator - там длина последовательности что-то около 10 в 27 степени.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн nucleon

  • Любитель
  • *
  • Сообщений: 92
    • Просмотр профиля
сори за то что потревожу дух мертвого топика...
но есть вопрос:
генерю случайность
srand(time(NULL)|clock());
position = rand()%100
но при последовательных и частых запросах,
получаю множество последовательных и одинаковых ответов....
подскажите, что делать чтобы этого избежать.?..


Оффлайн RandomNT

  • Любитель
  • *
  • Сообщений: 80
    • Просмотр профиля
srand достаточно вызвать только один раз, например при запуске программы

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Немножко теории. Генератор псевдослучайных чисел может генерировать множество псевдослучайных последовательностей. Какую именно он будет генерировать здесь и сейчас определяет sid. Собственно srand его и задаёт. После того, как sid установлен (обновлён) следующий вызов randr() вернёт первый элемент последовательности, вызвав randr() ещё раз ты получаешь второй элемент последовательности и так далее. Если ты установишь sid ещё раз то всё начинается по новой.

Пример кода:
(Нажмите, чтобы показать/скрыть)
Очень наглядно демонстрирует как это всё работает.

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

Оффлайн gorman

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля

 

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