Внедрение Rand

Я хотел бы узнать, как реализованы функции rand () и srand () и хотели бы настроить код, чтобы изменить его на мои требования. Где я могу найти исходный код rand () и srand ().

В качестве входного аргумента требуется семя, как обычно:

double result = srand(time(NULL)); 

и возвращает случайное число, которое соответствует вероятности и, следовательно, ожидаемому числу вхождений.

с форумов CodeGuru : –

 void __cdecl srand (unsigned int seed) { #ifdef _MT _getptd()->_holdrand = (unsigned long)seed; #else /* _MT */ holdrand = (long)seed; #endif /* _MT */ } int __cdecl rand (void) { #ifdef _MT _ptiddata ptd = _getptd(); return( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff ); #else /* _MT */ return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff); #endif /* _MT */ } 

Надеюсь это поможет.

rand и srand обычно реализуются как простой LCG , вы можете легко написать свои собственные (это несколько строк кода), не ища источников rand и srand . Обратите внимание, что если вам нужны случайные числа для «серьезных» целей (например, криптография), существуют гораздо лучшие ГСЧ, чем LCG.

Кстати, сам стандарт C включает пример реализации rand и srand :

 static unsigned long int next = 1; int rand(void) // RAND_MAX assumed to be 32767 { next = next * 1103515245 + 12345; return (unsigned int)(next/65536) % 32768; } void srand(unsigned int seed) { next = seed; } 

Glibc one (используется gcc) – простая формула:

 x = 1103515245 * x + 12345 

обертывая вокруг 2 32 , как показано здесь . Вы можете просто установить x в качестве семени, затем продолжить вызов функции для оценки этого выражения (и обновления семени).

Но вы должны знать, что линейные конгруэнтные генераторы, подобные этому, считаются адекватными, но не идеальными.

Хотя единственный идеальный генератор случайных чисел был бы совершенно случайным, Mersenne Twister, вероятно, приближается.

  • Как работает ORDER BY RAND () MySQL?
  • Генератор случайных чисел Vb.net генерирует одинаковое число много раз
  • Получение случайного элемента из ArrayList
  • Создать случайную дату рождения
  • Выберите случайное значение из enums?
  • Есть ли возможность генерировать случайный символ в Java?
  • Эффективное определение случайных чисел
  • Случайный взвешенный выбор в Java
  • Генератор случайных чисел
  • Взвешенные случайные числа
  • Как создать случайный номер int в C #?
  • Давайте будем гением компьютера.