Требуется генерировать случайные числа в диапазоне от 0 до больше чем RAND_MAX, и чтоб распределение было более менее равномерное.
ну и скорость чтоб не самая медленная. и еще чтоб кроссплатформенно.
Думаю что уже где то есть, подскажите где. а то велосипед изобретать не охота.
А>Требуется генерировать случайные числа в диапазоне от 0 до больше чем RAND_MAX, и чтоб распределение было более менее равномерное. А>ну и скорость чтоб не самая медленная. и еще чтоб кроссплатформенно.
ну ты хоть пояснил бы -- целые числа тебе нужны или нецелые. Какой результирующий тип нужен? uint64_t?
Здравствуйте, Аноним, Вы писали:
А>Требуется генерировать случайные числа в диапазоне от 0 до больше чем RAND_MAX, и чтоб распределение было более менее равномерное. А>ну и скорость чтоб не самая медленная. и еще чтоб кроссплатформенно. А>Думаю что уже где то есть, подскажите где. а то велосипед изобретать не охота.
Я лично использую криптографический генератор псевдослучайных чисел, предоставляемый операционной системой (/dev/urandom в унихе и CryptoAPI в венде). Само по себе оно не кроссплатформенно, но если обернуть его системно-зависимой оберткой, то весь остальной код об этой некроссплатформенности может и не знать.
Если бы мне был нужен заведомо более-менее быстрый генератор, я взял бы исходник RC4, отломил бы от него смешивание псевдослучайной последовательности с данными (поскольку нужна только псевдослучайная последовательность), в качестве ключа использовал бы какое-нибудь разумное количество байтов из системного генератора, и первый килобайт сгенерированной последовательности отправлял бы в /dev/null — говорят, у RC4 первый килобайт не очень хороший.
Здравствуйте, Аноним, Вы писали:
А>Требуется генерировать случайные числа в диапазоне от 0 до больше чем RAND_MAX, и чтоб распределение было более менее равномерное. А>ну и скорость чтоб не самая медленная. и еще чтоб кроссплатформенно. А>Думаю что уже где то есть, подскажите где. а то велосипед изобретать не охота.
rand() использует линейный конгруэнтный метод,
можно использовать его же, но без ограничения RAND_MAX
Здравствуйте, dilmah, Вы писали:
А>>Требуется генерировать случайные числа в диапазоне от 0 до больше чем RAND_MAX, и чтоб распределение было более менее равномерное. А>>ну и скорость чтоб не самая медленная. и еще чтоб кроссплатформенно.
D>ну ты хоть пояснил бы -- целые числа тебе нужны или нецелые. Какой результирующий тип нужен? uint64_t?
обычного uint 32 бита хватит, хотя сойдет и double от 0 до 1
Здравствуйте, Аноним, Вы писали:
А>Требуется генерировать случайные числа в диапазоне от 0 до больше чем RAND_MAX, и чтоб распределение было более менее равномерное. А>ну и скорость чтоб не самая медленная. и еще чтоб кроссплатформенно. А>Думаю что уже где то есть, подскажите где. а то велосипед изобретать не охота.
нашел тут один метод, подскажите имеются ли недостатки у такого метода
в принципе такого максимума мне хватает
Здравствуйте, thesynapse1, Вы писали:
T>Здравствуйте, dilmah, Вы писали:
А>>>Требуется генерировать случайные числа в диапазоне от 0 до больше чем RAND_MAX, и чтоб распределение было более менее равномерное. А>>>ну и скорость чтоб не самая медленная. и еще чтоб кроссплатформенно.
D>>ну ты хоть пояснил бы -- целые числа тебе нужны или нецелые. Какой результирующий тип нужен? uint64_t?
T>обычного uint 32 бита хватит, хотя сойдет и double от 0 до 1
Последний вариант реализуется совсем просто. Можно также создать на его основе небольшой дополнительный набор перегрузок.
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, thesynapse1, Вы писали:
T>>Здравствуйте, dilmah, Вы писали:
А>>>>Требуется генерировать случайные числа в диапазоне от 0 до больше чем RAND_MAX, и чтоб распределение было более менее равномерное. А>>>>ну и скорость чтоб не самая медленная. и еще чтоб кроссплатформенно.
D>>>ну ты хоть пояснил бы -- целые числа тебе нужны или нецелые. Какой результирующий тип нужен? uint64_t?
T>>обычного uint 32 бита хватит, хотя сойдет и double от 0 до 1
R>Последний вариант реализуется совсем просто. Можно также создать на его основе небольшой дополнительный набор перегрузок. R>
R>Возможно, возникнет вопрос о разрешающей способности генератора. Этот вопрос легко решается незначительным усложнением первой функции.
насколько мне кажется в варианте
double random() { return rand() / double(RAND_MAX + 1); }
некоторые числа не быдут выпадать никогда тоесть у нас остаеться те же RAND_MAX комбинаций
_DA>>Только надо не забывать, что в этом случае различных чисел будет все равно не больше RAND_MAX, только размазанных по большем интервалу.
T>почему? этот вариант должен же генерить от 0 до XRAND_MAX.
Потому что значение, возвращаемое rand, однозначно определяется предыдущим значением.
Здравствуйте, thesynapse1, Вы писали:
T>а что это за магическое число 0x8088405? T>и насколько распределенная последовательность у всего этого получится?
Прочитайте про линейный конгруэнтный метод, хотя бы в википедии. Там есть таблица примеров чисел, это одно из них (используется в делфи).
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, thesynapse1, Вы писали:
T>>а что это за магическое число 0x8088405? T>>и насколько распределенная последовательность у всего этого получится?
A>Прочитайте про линейный конгруэнтный метод, хотя бы в википедии. Там есть таблица примеров чисел, это одно из них (используется в делфи).
я думаю в стандартном rand отсекается часть потому что младшие двоичные разряды сгенерированных таким образом случайных чисел демонстрируют поведение, далёкое от случайного, поэтому рекомендуется использовать только старшие разряды.