Я пытаюсь перенести некоторый код из UNIX в Windows, и мне нужна реализация функций POSIX srandom(x)
и random()
, которые для данного семени x
сгенерируют такую же последовательность чисел, что и для POSIX.1- 2001. Каковы некоторые из доступных опций в Windows?Windows-эквивалент функций POSIX srandom (...) и random()?
ответ
srandom
и семья являются членами Glibc. Скорее всего, вы можете скопировать the source code from glibc для srandom/random в ваше приложение, если оно совместимо с лицензией. Если вы ищете другую реализацию, любой небольшой амур
Помните, что POSIX - это фактически соответствие интерфейса, а не соответствие реализации - на самом деле он не указывает, для чего механизм предназначен для его создания, а также то, что результирующие числа должно быть.
Если вы хотите гарантировать такую же последовательность номеров на нескольких платформах, то вам не следует полагаться на стандартную библиотечную реализацию любого из генераторов случайных чисел, вы должны делать свою собственную или перерабатывать известную реализацию.
Как уже отмечался в комментариях по JWWalker, есть довольно хороший boost random implementation, который обеспечивает хороший набор
C++
классов для случайных чисел, но этоC++
, неC
- другой язык, так что, вероятно, непосредственно не подходит.
Вы можете проверить функции rand_s и srand в Windows. Но я не уверен, соответствуют ли они стандартам POSIX.
EDIT
Лучше один, кажется, CryptGenRandom. Проверьте это link.
'rand_s' не использует семя, установленное' srand', а 'rand' возвращает 15-битное случайное число, в отличие от 31-битного случайного числа, возвращаемого' random'. – JWWalker
Если вы ищете какой-то простой генератор псевдослучайных вы можете использовать генератор линейного сравнения http://en.wikipedia.org/wiki/Linear_congruential_generator
например. первый пример:
unsigned int seed = 2;
unsigned int rand()
{
seed = 1664525 * seed + 1013904223;
return x;
}
void srand(unsigned int new_seed)
{
seed = new_seed;
}
Для генераторов случайных чисел с открытым исходным кодом см. [Случайная библиотека Boost] (http://www.boost.org/doc/libs/1_61_0/doc/html/boost_random/reference.html). – JWWalker
Ссылки мертвы. Я получил файл, который мне нужно скомпилировать, что мне делать, чтобы заменить srandom? –
@ TomášZato Я обновил ссылку, чтобы указать на ссылку на источник для glibc random.c, которая должна оставаться в живых в обозримом будущем. Это код glibc и имеет лицензию, связанную с ним, что может сделать его непригодным для использования. – Petesh