2015-02-19 3 views
0

Я пишу код, который будет возвращать случайное число от 5 до 20, и я столкнулся с проблемой, когда он всегда будет производить одинаковое число заново, и я не могу показаться решить его.Программа C для генерации случайных чисел

#include <stdlib.h> 
#include <stdio.h> 

int random = 0; 

int randomnumbergen() { 
srand(12345); 
random = rand() % (20 - 15) + 15; 
return random; 
} 
+0

на самом деле не чудо - вы семя генератора случайных чисел с одинаковым значением все их время! –

+0

Как только вы установили 'srand()' fixed, я думаю, что у вас все еще будут проблемы с 'random = rand()% (20 - 15) + 15;'. – FoggyDay

+0

@FoggyDay: это зависит от того, находится ли опечатка в коде или инструкции диапазона. IIRC, вам нужно «+ 1» в модульном диапазоне, чтобы получить 6 номеров 15..20 (или 16 номеров из 5..20). –

ответ

2

Во-первых, вы хотите вызвать srand() в начале вашей программы один раз.

Далее, вы хотите заменить

srand(12345); 

с

srand (time(NULL)); 
+0

Это все равно приведет к возврату того же числа *, если randomnumbergen() вызывается многократно в узком цикле *. –

+0

@EricJ. true, но, по крайней мере, на шаг впереди использования одного и того же числа каждый раз. –

+0

@JonathanLeffler: Я бы сказал, что это хуже, потому что единичный тест для функции, которая не учитывает временный фактор, вполне может показать, что он «работает», в то время как он терпит неудачу при использовании в цикле. Эффективно ошибка лучше скрыта. –

0

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

+2

Но удаление вызова 'srand()' также оставляет результаты детерминированными, хотя и с другой последовательностью. Вы должны каждый раз вызывать 'srand()' с другим номером. Рассмотрим считывание случайного числа из '/ dev/urandom'. –

+1

Замечание верно, предлагаемое решение является специфичным для системы. –

+0

@EricJ. Предлагаемое решение работает на большинстве современных версий Unix (Mac OS X, Linux, которые я тестировал в этом году, я думаю, что он работает на Solaris, но я не использовал его уже пару лет - я не уверен в HP-UX и AIX). Нет более портативного решения для получения разумного случайного семени, о котором я знаю. –

Смежные вопросы