使用系统时间的随机数都是一样的
Random numbers using system time all the same
我在C++中编写了一个函数,该函数使用time.h
的系统时间作为种子,并返回两个指定值之间的伪随机数。
#include <time.h>
int randInt(int min, int max)
{
int nSeed = time(NULL);
int nRandom = nSeed * 13;
nRandom = nRandom % (max + 1);
nRandom += min;
return nRandom;
}
该函数完全执行它应该做的事情(据我所知)。但是,当我反复调用该函数时,例如,当使用 for
循环用伪随机数填充数组时,几乎没有时间过去,因此种子是相同的,使数组中的每个数字都相同。我该如何解决这个问题?有没有办法从系统中获取精度较小的时间?还是我完全错误地这样做?
你应该得到一个种子(例如时间),然后通过重复应用阶跃函数生成几个值。没有,你的"PRNG"只是一个适用于种子生成的哈希函数,这通常不是很随机。将种子与阶跃功能分离还允许确定性操作(固定种子)进行调试或可重现的结果。
正如其他人指出的那样,您不应该为每次调用函数重新设定种子。
但是,对于两次呼叫randInt
,您获得相同号码的具体问题更有可能是由于time
以秒为单位返回时间。因此,在一秒钟内,对函数的所有调用都将使用完全相同的种子,从而返回完全相同的值。
但我强烈建议使用C++11的一部分<random>
或boost::random,这对于旧版本的C++基本相同
生成一系列随机值时,不得重复为 PRNG 设定种子。仅播种一次,通常在程序开始时播种。
您遇到的问题是错误重新播种的明显后果。一个更严重的问题是,重新播种可能会破坏PRNG的分布特性。
您的PRNG的一个大问题是您不存储先前生成的值。这就是导致您每次采样时重新播种的原因。解决方案是记住 PRNG 生成的先前值,并从该值开始,而不是从 time(NULL)
.
您可以简单地添加一些延迟或睡眠,以免在种子中具有相同的时间,但是正如其他人建议的那样,您不应该生成自己的PRNG,您可能需要添加一些鼠标位置,一些数据包接收或其他因素以增加随机性,但这仍然不是生成随机数的好方法。
- C++,系统无法执行指定的程序
- 在UNIX系统中使用DIR查找文件的字节大小
- 错误处理.将系统错误代码映射到泛型
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在C++游戏中与库存系统作斗争
- 文件系统:复制功能的速度秘诀是什么
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 在gtest.中使用fff.h模拟系统API
- 如何制作无限制照明系统
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅地
- 如何在文件系统之上添加层?就像OneDrive或Google云端硬盘中的缓存一样
- 鸟类调查中的项目在代码中遇到问题.如何像数据库系统一样存储数据
- 像C++一样编写高效的实体系统
- 有没有办法像系统("pause")一样暂停?
- 使用系统时间的随机数都是一样的
- 我能否像在PythonQt中一样利用PyQt中的Qt Meta-Object系统?
- 如何创建文件路径可以像磁盘一样访问的虚拟文件系统