C++随机整数函数

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

这不是通常做的事情,但在突发情况下应该记在心里。


8

您需要不断地重新生成随机数。请在程序开始时仅调用一次srand(time(NULL));


0

随机函数(无论是哪种语言)只是部分随机。

在每种技术中,你都会有一个相应的等价物。

srand(time(NULL));

这段代码将随机函数的种子设置为一个起始值,然后从那里开始生成数字。这意味着,如果您总是从相同的值重新设置种子,您将始终获得相同的数字。
在您的情况下,您需要像这样做(仅调用srand(time(NULL));一次)。
int rolld6 (void) {
    return rand() % 6 + 1;;
}

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

使用相同的值进行种子处理的优点之一是可以重新生成相同的随机数序列。

在我的一个游戏中,我会在屏幕上随机放置物体,但我也想实现重试选项。使用相同值重新进行种子处理的这个选项使我能够重新执行而无需存储所有随机值^^


4
你的第一个陈述并不完全正确。一些现代系统在硬件中包含真正的随机数生成器,可以通过Linux上的/dev/random进行访问,无需进行种子输入。 - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接