5

我在 C 中工作,我正在尝试(拼命地)制作一个随机生成器,它不仅在每次运行生成器时生成不同的数字,而且在每次运行程序时生成不同的序列。我测试了我在网上找到的几乎所有东西。我导致了 2 种很好的方法来制作一个好的随机生成器。第一个是每次都使用不同的种子。但这意味着我每次都必须使用不同的随机种子,这是我一开始没有解决的问题。这是我现在正在尝试的,但这不是真的随心所欲:

int myrand(int random_seed){
  random_seed = random_seed * 1103515245 +12345;   
  return (unsigned int)(random_seed / 65536) % 32768; 
                           }

每次我调用该函数时,我都会将种子增加 1。

第二种方法是使用时间。时间变化,这是随机性。我也尝试了很多方法来实现这一点。我最近的尝试是: 编译器错误-可能的 IDE 错误“未定义对 gettimeofday 错误的引用” 但我无法使用gettimeofday 函数,因为我在 Windows 中工作。同样在那个问题中我没有得到任何答案。

任何人都可以帮助我如何在 Windows 中工作的 C 中实现随机生成器(可能使用时间)?或者我应该使用 Unix 吗?

4

6 回答 6

4

用良好的熵源为您的 RNG 播种。

在 unix 下,使用 /dev/random。

在 Windows 下,使用 CryptoAPI - Windows 等价于 /dev/random

于 2012-12-18T17:42:57.380 回答
3

您要的不是随机数生成器,而是如何使用已经包含在 C 标准库中的随机数生成器。

您需要做的就是在程序启动时播种一次:

srand(time(NULL));

就这样。它是可移植的,每次运行程序时都会为您提供不同的序列,因为自上次运行以来至少已经过去了一秒钟。

以后再播种没有坏处,但也没有意义。

于 2012-12-18T17:44:12.970 回答
1

C 标准库具有头文件 time.h(如果您使用 C++,则为 ctime)(参考)。Windows 和 Unix 将支持那里的功能。

我会推荐 time() 或 clock() 作为随机数生成器的种子。

另一种获得完全随机输入的方法是使用鼠标位置或其他受外部影响的东西。

于 2012-12-18T17:49:39.740 回答
0

实现 prng 的方法有很多,但不幸的是,它们都不是真正的随机数生成器。time(NULL) 是一个好方法,但我使用的是“blum blum shub”。它生成一位随机数

于 2012-12-18T18:41:03.423 回答
0

由于您明确要求 Windows 解决方案,我建议您避免time(NULL)clock()作为种子,srand()因为它们的粒度非常有限(毫秒)。相反,您可以使用性能计数器的结果:

LARGE_INTEGER PerformanceCount;
QueryPerformanceCounter(&PerformanceCount);
srand(PerformanceCount.LowPart);

可以通过调用QueryPerformanceFrequency( ) 来获得 QueryPerformanceCounter()频率的递增率。这通常至少增加 1 MHz,有时甚至增加到 GHz 范围。因此,它为种子提供了一个快速变化的来源。

编辑:从您之前的问题中可以理解,gettimeofday()类似的实现也不会提供精细的粒度。它可能会在其参数中显示该词tv_usec,但在 WINdows 上它不会像在 Linux 系统上那样提供微秒粒度。

于 2012-12-19T10:18:03.537 回答
0

引用:

to make a random generator that not only generates a different number every time i run the generator

随机的定义不包括该概念。相反,这个想法是你有平等的机会选择任何数字,而不管之前选择的数字是多少。这意味着理论上可以选择两次相同的数字。

如果您正在处理一副牌,那么这符合您的无重复标准。使用套牌处理方法意味着跟踪“使用过的”数字。

您还应该知道 PNRG(伪随机数生成器)是循环的(周期性的)。在您生成数字(通常是一个大数字)之后,您重新开始并准确地重复数字的名称序列。UNIXrand()函数在 [0, {RAND_MAX}] 范围内生成整数整数,周期为 2^32

真的考虑阅读这个简短的页面:

见: http: //pubs.opengroup.org/onlinepubs/009695399/functions/rand.html

于 2012-12-19T12:54:30.593 回答