1

有什么方法可以在不使用种子的情况下在 C 中生成随机数。

到目前为止,这里有什么,但它仍在使用 srand(time(NULL)); 这是一粒种子。

#include <stdio.h>
#include <time.h>
#include <math.h> /* required for sqrt() */
#include <stdlib.h> /* required for rand() */

int gen_rand();   /* note these are declarations of functions */

void main()
{
   int number;
   srand (time(NULL)); /* everytime you run program, it will give you different result */

   number = gen_rand();

   printf("%d is the power of 2 of %.0lf\n", number, sqrt(number));
}

/* Function generates random number power 2 of 20 - 230 */
int gen_rand()
{
   int n;
   n = rand() % 211;  /* n is random number in range of 0 - 210 */
   n = n + 20; /* n is now in range of 20 - 230 */
   return(n*n); /* return n to the power of 2 */
}
4

4 回答 4

2

是和不是。基本上有两种方法可以在 c 中获得甚至是远程随机数。

1) 有一个带有种子的伪随机数生成器——这是一种算法,它使用巧妙的算术运算符和可能的大量混合、置换、扭曲等内部变量产生一些数字序列。种子可以是隐式的(即始终为零,并且每次运行程序时,都会生成相同的序列)。或者它可以是显式的,在运行之间可以以某种方式更改种子。

2)使用外部数据源,在运行之间以某种方式发生变化。这可能来自计时器、环境变量(可能是程序 ID)、来自相机的噪音、鼠标移动等。

1+2) 使用外部噪声源作为伪随机数生成器的种子。

于 2012-10-15T08:28:38.477 回答
1

所有基于非硬件的 PRNG 都需要某种形式的随机输入来对抗其确定性,因此始终需要种子。

您可以尝试/dev/rand在 linux 下滥用(但它也是一个 PRNG),或者如果您有一个非常现代的 Intel CPU,他们新的数字 RNG 工具就可以工作。

于 2012-10-15T08:25:25.333 回答
0

不会。如果您不为自动数字生成器播种,它的行为将具有确定性,并且每次都产生相同的数字。

于 2012-10-15T08:26:06.453 回答
0

是的。rand()但是,通过使用函数而不使用种子来生成随机数将为您提供相同的随机数集。

于 2012-10-15T11:15:21.523 回答