2016-10-25 3 views
1
int random_var(void); 

int main(void) 
{ 
    int i; 
    for (i = 1; i <= 50; i++) 
     printf("%d\n", random_var()); 

return 0; 
} 


int random_var(void) 
{ 
    srand((unsigned) time(NULL)); 
    return rand() % 2; 
} 

Мне поручено написать функцию, которая возвращает случайное значение 1 или 0 каждый раз, когда он вызывается. Мой код продолжает возвращать фиксированное значение, хотя я использовал случайный генератор для семени, почему?Функция, возвращающая случайное значение 1 или 0

+1

Вы можете просто «вернуться! Rand();'. Никто не сказал ничего об относительной вероятности 1 и 0. – EOF

+0

@EOF: Вы могли бы просто «вернуть 0;». Никто не сказал ничего об относительной вероятности 1 и 0. –

+0

@ KeithThompson Предполагаю, что вы будете полагаться на случайные космические лучи, которые немного перевернут, чтобы обеспечить требуемую случайность? – EOF

ответ

1

Вы должны позвонить srand() только один раз!

int random_var(void); 

int main(void) 
{ 
    int i; 
    srand((unsigned) time(NULL)); 
    for (i = 1; i <= 50; i++) 
     printf("%d\n", random_var()); 

    return 0; 
} 


int random_var(void) 
{ 
    return rand() % 2; 
} 

В качестве альтернативы (или дополнительно), а Кит Томпсон отметил, вы можете попробовать принимать более высокие биты порядка вместо, которые могут распространять лучше.

+1

* Некоторые * реализации 'rand()' возвращают чередующиеся четные и нечетные числа. [comp.lang.c FAQ] (http://www.c-faq.com) вопрос 13.18. –

+0

@KeithThompson, я бы поднял ваш комментарий, если бы сегодня не достиг сегодняшнего лимита. Однако, к сожалению, [некоторые популярные реализации не будут ...] (https://ideone.com/ajAD1Y) – StoryTeller

+0

Конечно, если вы повторно засеяете с тем же значением, вы получите те же результаты. –

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