Техника

Почему функция rand в C++ при генерировании последовательностей орел-решка не может сгенерировать последовательности

не может сгенерировать последовательности более 15 орлов\решек подряд?
Natu Angel
Natu Angel
1 692
Вот представь, у меня она после запуска всегда через одно и то же кол-во вызовов выдавала 15 орлов подряд.
Потом вставил srand (time(0)); в начало main(), всё вылечилось - стала каждый раз за разное кол-во итераций выдавать 15 орлов.

Вопрос: какого хрена?
А я тебе скажу. Инициализация ГПСЧ (генератора псевдо-случайных чисел) - задача обычно (по времени) более трудоемкая по сравнению с последующей генерацией оных большими пачками.
Валентина Тукачёва
Валентина Тукачёва
76 843
Лучший ответ
Natu Angel Я произвел инициализацию по времени. Я не такой наивный простачок. И даже с семенем по времени больше 15-ти не выдает.
вообще-то "штатная" функция rand в стандартной сишной библиотеке - вообще безобразна, у нее следующее число генериуется из предыдущего, причем состояние хратинся в 32-битовых long, а значит максимальная длина последовательности, которую она выдает - 2^32-1 (0 - не бывает), после этого все идет по циклу, так что если вы за этот цикл не встретили то, что искали - не встретите никогда.

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

если бы числа были действительно случайными, то вероятность встретить была бы 1/2^15, то есть вам потребовалось бы перебрать порядка 2^15 чисел.

можно использовать "замешивание", берется два датчика разной природы, один - хороший, второй - любой. Изначально первым датчиком заполняется буфер, скажем в 1013 чисел, затем при каждом обращении вторым датчиком выбирается одно число из буфера, его возвращают в качестве случайного а на его место пишется новое число, сгенерированное первым датчиком.

Ну и если вы хотите получать орлы и решки - надо брать старшие биты, чем младше бит - тем он менее случаен. Самый младший вообще чередуется 0-1-0...
Данил Шептунов
Данил Шептунов
64 670
Sergei Urevich Кстати, в стандарте C++11 для генерации псевдослучайных чисел много всего нового появилось:
http://en.cppreference.com/w/cpp/numeric/random

Похожие вопросы