2016-08-12 3 views
2

Мне было интересно, какой лучший способ получить уникальное случайное число каждый час в C было. У меня есть целые числа часа, месяца, дня месяца и дня недели и хочу получать случайное число от 0 до 8 в час. Первоначально я пробовал делать (hour* month* day_month*week_month)%8, но я думаю, что он часто повторяет определенные числа. Будет ли лучший способ сделать это?Получайте уникальное случайное число каждый час

+1

Добавить это до: srand (время (NULL)); – FreeStyle4

+0

Есть ли причина, по которой вы не можете просто использовать стандартный криптографически безопасный RNG? –

+0

Неужели вы не надежно * случайны или просто кажутся случайными? –

ответ

1

Один простой способ будет сделать что-то вроде следующего:

int hourly_random() 
{ 
    srand(time(NULL)/3600); 
    return rand() % 8; 
} 

Просто множительной неслучайные целые числа, не даст вам что-то случайное. Чтобы проиллюстрировать некоторые из многих проблем: если одно из значений равно 0, результат будет равен 0. Если вы поменяете значение двух входных переменных, результат останется прежним.

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

Если вы хотите использовать указанные вами переменные, вы должны объединить их так, чтобы они не «мешали» друг другу. Очевидным способом является умножение подстрок на максимальное значение, которое вы добавляете. То есть, что-то вроде hours + 24*(months + 12*(...)).

При создании собственного способа генерации случайных чисел, возможно, вам стоит посмотреть, как работают генераторы случайных чисел. Тем не менее, в общем, вы действительно не хотите, чтобы это делалось сами из-за всех ловушек. Вероятно, лучше полагаться на работу, которая уже была сделана раньше.

1

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

int hourly_random() 
{ 
    static time_t last = 0; 
    static int rand_val = 0; 
    time_t current; 

    current = time(NULL); 
    if (!last) { 
     srand(current+getpid()); 
    } 
    if ((current/3600) > (last/3600)) { 
     last = current; 
     rand_val = rand() % 8; 
    } 
    return rand_val; 
} 
Смежные вопросы