C ++ случайная функция int - PullRequest
       10

C ++ случайная функция int

4 голосов
/ 13 февраля 2011

Здравствуйте, дорогие участники stackoverflow, я недавно начал изучать C ++, сегодня я написал небольшую игру, но моя функция не работает должным образом.Когда я вызываю свою случайную функцию более одного раза, вместо этого она не генерирует число заново, она печатает одно и то же число снова и снова.Как я могу решить эту проблему без использования цикла?Спасибо

#include "stdafx.h"
#include <iostream>
#include <time.h>
using namespace std;
int rolld6();

int main()
{
    cout<<rolld6()<<endl;
    cout<<rolld6()<<endl;
    system("PAUSE");
    return 0;

}

int rolld6()
{
    srand(time(NULL));
    return rand() % 6 + 1;;
}

Ответы [ 3 ]

11 голосов
/ 13 февраля 2011

srand(time(NULL)); обычно следует делать один раз в начале main() и никогда больше.

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

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

#include "stdafx.h"
#include <iostream>
#include <time.h>
#include <stdlib.h>

int rolld6 (void) {
    return rand() % 6 + 1;
}

int main (void) {
    srand (time (NULL));
    std::cout << rolld6() << std::endl;
    std::cout << rolld6() << std::endl;
    system ("PAUSE");
    return 0;
}

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

Например, если вы выполнили вызов system() и у вас был скрипт cmd.exe, который вызывалтрижды вы можете увидеть что-то вроде:

1
5
1
5
1
5

Обычно это не то, что вы делаете, но следует помнить о том, что сценарий может всплыть.

8 голосов
/ 13 февраля 2011

Вы постоянно переполняете генератор случайных чисел. Вызывайте srand(time(NULL)); только один раз в начале вашей программы.

0 голосов
/ 13 февраля 2011

Случайные функции (независимо от языка) являются только частично случайными.

в каждой технологии у вас будет эквивалент

srand(time(NULL));

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

В вашем случае вы захотите сделать что-то подобное(NULL)); только один раз).

int rolld6 (void) {
    return rand() % 6 + 1;;
}

int main (void) {
    srand (time (NULL));
...
//call your function here
}

Одно из преимуществ заполнения с одним и тем же значением состоит в том, чтобы предложить возможность регенерировать одну и ту же последовательность случайных чисел.* в одной из моих игр я бы произвольно размещал объекты на экране, но я также хотел реализовать опцию повтора.этот вариант повторного заполнения из того же значения позволяет мне повторить его, не сохраняя все случайные значения ^^

...