程序每次执行时生成相同的“随机”数字

3

我正在尝试使用c4droid IDE编写一个简单的ASCII风格游戏,其中包含随机生成的世界。它支持C++,基本上我正在使用规则rand()%2 - 1生成array[width][height]瓷砖,其中rand()%2 - 1用于创建可行走的瓷砖,0表示墙壁。但是存在问题,每次我“随机”生成地图时,它看起来都一样,因为rand()并不真正随机。

我听说可以使用硬盘驱动器或其他部分所创建的熵。问题是我正在Android上使用它,因此对我来说实现起来很奇怪,因为C ++没有像Java那样广泛使用,所以我在谷歌上找不到解决方案。

简而言之:如何在Android上使用C++生成“几乎真实”的随机数?


2
你是否使用srand()初始化了你的随机数生成器? - fracz
2个回答

10

你需要用srand(time(NULL))种下随机数生成器的种子。这将允许计算机使用系统时间来生成伪随机数。

参考链接:http://www.cplusplus.com/reference/clibrary/cstdlib/srand/

编辑说明:最好注意,通常只需要在程序开始时对rand()函数进行一次种子操作。

int main()
{
 srand(time(NULL)) //only needed to be called ONCE
 //code and rand functions afterward
}

3
不是“完全随机”,仍然是伪随机,但从数字列表中的另一点开始。 - Luke B.
实际上,我看到了我的错误。我为每个瓷砖的Y和X都有2个“for”循环,并且每次都在调用srand([...])。这使得我的地图要么充满墙壁,要么充满自由空间。在循环之前进行srand设置会得到非常好的结果。非常感谢! - wirher
注意:这种做法已经在一些软件中导致了重放攻击漏洞。随机挑战对于同一秒钟窗口内的每个连接都是相同的,攻击者可以窃听合法用户的正确答案并提供相同的响应来认证他们自己的连接,只要他们在同一秒钟窗口内建立自己的连接即可。 - sh1

3
我认为rand()函数可以完成你所需的功能。你是否对随机数生成器进行了种子设置?
srand(time(NULL));
// Should be a different set of numbers each time you run.   
for(unsigned i = 0; i < 10; ++i) {
    cout << rand() % 2 - 1;    
}

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