4

亲爱的stackoverflow 成员你好我最近开始学习C++,今天我写了一个小游戏但是我的随机函数不能正常工作。当我多次调用我的随机函数时,它不会重新生成数字,而是一遍又一遍地打印相同的数字。如何在不使用 for 循环的情况下解决此问题?谢谢

#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;;
}
4

3 回答 3

11

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

这不是您通常会做的事情,但应该牢记这一点,以防出现这种情况。

于 2011-02-13T02:23:15.407 回答
8

您不断地重新播种随机数生成器。只在程序开始时调用srand(time(NULL));一次。

于 2011-02-13T02:23:03.083 回答
0

Random functions (no matter the language) are only partially random.

in every technology you will have a equivalent to

srand(time(NULL));

This piece of codes seeds the random function to a start value and then the numbers a generated from there onwards this means if your always reseeding form the same value you'll always get the same numbers

In your case you want to do something like this (calling srand(time(NULL)); only once).

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

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

one of the advantage of seeding with the same value is to offer the possibility to regenerate the same sequence of random numbers.

in one of my games, I would randomly place objects on the screen, but I also wanted to implement a retry option. this options of reseeding from the same value allows me to redo it without storing all the random values ^^

于 2011-02-13T02:41:23.453 回答