2016-11-07 3 views
0

Я пытаюсь создать случайное число/письмо, используя rand(), однако он просто возвращает одинаковое число/букву при каждом вызове.Генератор случайных чисел - не генерирует случайное число каждый раз

void Location::pick() { 
    srand(time(NULL)); 
    x = rand() % fieldSize + 1; 
    int locy = rand() % fieldSize + 1; // rand y 
    switch (locy) { 
    case 1: y = 'a'; break; 
    case 2: y = 'b'; break; 
    case 3: y = 'c'; break; 
    case 4: y = 'd'; break; 
    case 5: y = 'e'; break; 
    } 
} 

fieldSize установлен в 5. Я использую srand() наверху. Ниже я вызываю функцию.

void Fleet::deployFleet() { 
    bool newLoc = true; 
    Location tmp; 

    for (int i = 0; i < fleetSize; i++) { 
     tmp.pick(); 
     ships[i].setLocation(tmp); 
    } 
} 

fleetSize установлен на 5. ships [] представляет собой массив из 5 кораблей. setLocation() просто устанавливает местоположение судна для данного параметра.

+1

Не используйте 'rand()', особенно не 'rand()% n'. Подробнее [здесь] (http://www.azillionmonkeys.com/qed/random.html). Вместо этого используйте 'srand' со временем в качестве параметра. –

+0

вновь открылся, поскольку код немного отличается. Очень тесно: http://stackoverflow.com/questions/37701567/calling-a-random-number-generating-member-function-doesnt-produce-entirely-rand – NathanOliver

+0

Все об этом коде не работает. Несколько посевов, используя 'time (NULL)' в качестве семени, используя 'rand()', используя '%', чтобы ограничить диапазон чисел ... Я даже не знаю с чего начать. – nwp

ответ

2

Псевдослучайные генераторы генерируют одну и ту же последовательность «случайных» чисел для одного и того же семени.

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

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