2010-05-01 2 views
1

int randomNumber = (double)rand()/(RAND_MAX + 1) * (10 - 0) + 0;случайного числа в VC++

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

Может ли кто-нибудь увидеть, что я делаю неправильно?

+0

Почему вы выбрали возвращаемое значение 'rand()' '' double'? Хуже того, почему вы C-casting? Почему такая аппетитная аппликация, вычитание нуля и добавление нуля? Чтобы быть ясным, идиоматическое использование 'rand()' является 'int r = rand()% (ubound-lbound) + lbound;', но только если нижняя граница не равна нулю. Если это так, вы можете оставить это. – wilhelmtell

+0

@WilhelmTell of Purple-Magenta: То, что вы предлагаете, конечно, не идиоматично. Многие генераторы псевдослучайных чисел значительно менее случайны в своих младших разрядах, чем бит высокого порядка. Для многих значений модуля «ubound-lbound», использующего модуль, может возникнуть генерация значительных неслучайных шаблонов. Без конкретных знаний о реализации гораздо безопаснее использовать деление и использовать случайность бит высокого порядка. –

ответ

6

Попробуйте посеять его с разным значением каждый раз.

srand(time(0)) 
+1

'srand (getpid())' также может использоваться. вам нужно включить 'ctime' для' time() ' –

+0

@N или, возможно, еще лучше,' srand (time (0)^getpid()) '. – wilhelmtell

+0

Говорят, что 'srand (time (0))' будет делать для большинства случаев, но иногда это недостаточно. Например, если вы пишете стандартный инструмент командной строки Unix, где запускается ваше приложение и (часто) уходит относительно быстро, вам нужно более сложное семя. Чтобы увидеть проблему, в Bash попробуйте что-то вроде следующего: 'for i в $ (seq 10); do ./a.out; done' (где 'a.out' - имя вашего исполняемого файла). Вы увидите, что вы (большую часть времени) получаете одинаковое значение. Причина в том, что оболочка выполняет программу (10 раз) так быстро, что программа получает одно и то же семя для 'time (0)'. – wilhelmtell

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