我在C工作,我正在努力(拼命)制作一个不仅生成的随机生成器 每次运行发生器时都会有不同的数字,但每次运行程序时都会有不同的序列。我测试了几乎我在网上发现的所有内容。我找到了两种很好的方法来制作一个好的随机发生器。 第一个是每次都使用不同的种子。但这意味着我每次都必须使用一个不同的随机种子,这是我一开始没有解决的问题。这就是我现在正在尝试的但它不是真正的我随意随意:
int myrand(int random_seed){
random_seed = random_seed * 1103515245 +12345;
return (unsigned int)(random_seed / 65536) % 32768;
}
每当我调用该函数时,我都会将种子增加1。
第二种方式是使用time.Time更改,这是随机性。我也尝试了很多方法来实现这一点。我的最新尝试在这里: Compiler error-Possible IDE error"undefined reference to gettimeofday error" 但是我无法使用gettimeofday函数,因为我在Windows中工作。在那个问题中,我没有得到任何答案。
有没有人可以帮助我如何在C中使用Windows实现随机生成器(可能使用时间)?或者我应该使用Unix吗?
答案 0 :(得分:4)
为你的RNG种植一个良好的熵源。
在unix下,使用/ dev / random。
在Windows下,使用像CryptoAPI这样的内容 - Windows equivalent of /dev/random
答案 1 :(得分:3)
您要求的不是随机数生成器,而是如何使用C标准库中已包含的随机数生成器。
您需要做的就是在程序启动时将种子播种:
srand(time(NULL));
这就是全部。它是可移植的,每次运行程序时都会给你一个不同的顺序,因为自你上次运行它以来已经过了至少一秒。
以后再次播种没有任何害处,但也没有任何意义。
答案 2 :(得分:1)
C标准库具有标题time.h(如果使用C ++,则为ctime)(reference)。 Windows和Unix将支持那里的功能。
我建议将time()或clock()作为随机数生成器的种子。
获取完全随机输入的另一种方法是使用鼠标位置或受外界影响的其他事物。
答案 3 :(得分:0)
实现prng的方法有很多种,但不幸的是它们都不是真正的随机数生成器。时间(NULL)是一个很好的方法,但我正在使用“blum blum shub”。它生成一位随机数
答案 4 :(得分:0)
由于您明确要求提供Windows解决方案,因此我建议避免将time(NULL)
或clock()
作为srand()
的种子,因为它们的粒度非常有限(ms)。相反,您可以使用性能计数器的结果:
LARGE_INTEGER PerformanceCount;
QueryPerformanceCounter(&PerformanceCount);
srand(PerformanceCount.LowPart);
通过调用QueryPerformanceCounter()可以获得QueryPerformanceFrequency()频率的增量率。这通常在至少1 MHz处增加,有时甚至在GHz范围内增加。因此,它为种子提供了快速变化的来源。
修改:从您的earlier question中了解,同样gettimeofday()
的实施方式也不会提供精细的细化。它可能在其参数中显示单词tv_usec
但在WIndows上它不会像在Linux系统上那样提供微秒粒度。
答案 5 :(得分:0)
报价:
to make a random generator that not only generates a different number every time i run the generator
随机的定义不包括该概念。更确切地说,无论之前选择的数字是多少,您都有相同的机会选择任何数字。这意味着理论上可以选择两次相同的数字。
如果您正在处理一副卡片,那么这符合您没有重复的标准。使用甲板处理方法意味着跟踪“使用过的”数字。
您还应该知道PNRG(伪随机数生成器)是循环的(周期性的)。生成数字后,通常是一个很大的数字,然后重新开始并重复数字的名称序列。 UNIX rand()
函数生成[0,{RAND_MAX}]范围内的整数整数,周期为2 ^ 32
真的考虑阅读这个简短的页面:
请参阅:http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html