rand with seed не возвращает случайное значение, если функция зациклена - PullRequest
8 голосов
/ 29 ноября 2011

Я написал этот код C ниже, когда я повторяю цикл, он возвращает случайное числоКак я могу получить 5 разных случайных значений, если выполняется myrand ()?

Ответы [ 5 ]

23 голосов
/ 29 ноября 2011

Заполнение генератора должно быть выполнено один раз (конечно, для каждой последовательности случайных чисел, которую вы хотите сгенерировать!):

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

int main()
{
    int seed = time(NULL);
    srand(seed);
    int value = 0;
    int i=0;
    for (i=0; i< 5; i++)
    {
        value =rand();
        printf("value is %d\n", value);
    }
}
5 голосов
/ 29 ноября 2011

Переместите вызов srand() в main() перед циклом.

Другими словами, позвоните srand() один раз, а затем позвоните rand() несколько раз, без дальнейших вызовов srand():

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

int main()
{
    int value = 0;
    int i = 0;
    srand(time(NULL));
    for (i = 0; i < 5; i++)
    {
        value = rand();
        printf("value is %d\n", value);
    }
}
0 голосов
/ 27 февраля 2014

Если вы хотите повторно заполнить (для дополнительная случайность) каждый раз, когда вы звоните random(), вот один способ, которым вы могли бы сделать это:

srandom( time(0)+clock()+random() );
  • time() обновляется один раз в секунду, но будет отличаться при каждом запуске вашей программы
  • clock() обновляется гораздо чаще, но начинается с 0 при каждом запуске вашей программы
  • random() гарантирует, что вы (обычно) не будете повторно заполнять одно и то же значение дважды подряд, если ваш цикл быстрее, чем степень детализации clock()

Конечно, вы могли бы сделать больше, если вы действительно, действительно хотите случайности - но это только начало.

0 голосов
/ 29 ноября 2011

Попробуйте это:

#include <stdio.h>
#include <time.h>
int main(void) {
    for (int i = 0; i < 10; i++) {
        printf("%ld\n", (long)time(NULL));
    }
}

Мое "предположение" состоит в том, что будут напечатаны 10 равных значений:)

0 голосов
/ 29 ноября 2011

Смысл seed () - запустить последовательность случайных чисел с известным значением,
тогда вы всегда будете получать одинаковую последовательность чисел с одним и тем же начальным числом.

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

...