关于计算机取随机数的工作原理?

2024-11-23 00:45:04
推荐回答(3个)
回答1:

你是要问计算机还是计算器

计算机一般只用伪随机数函数来取伪随机数(就是说这一系列数都是算出来的,其实不是随机的,只不过这个算法尽量让结果看起来比较散)。 当然也有利用输入来取随机数的做法(比如SecureCRT), 但是用的非常少, 因为这时候需要你猛晃鼠标什么的, 对用户来说太别扭。
其实一两个随机数从输入取还是可行的, 只不过很多时候是需要一系列的随机数, 这时候指望输入就没戏了,还是伪随机数方法来的通用些

至于计算器, 不知道, 估计也就是伪随机数函数

回答2:

那样是不行的,现在的电脑上一般都是伪随机数。
实际上当你取了很多以后会循环的(一般是2^32至2^64为一个循环)
开始的时候使用srand,这个函数会和当前时间有关。

普通算法(摘自POSIX,就是一个例子)
static unsigned long next = 1;
int myrand(void) /* RAND_MAX assumed to be 32767. */
{
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}

回答3:

在计算机中并没有一个真正的随机数发生器,但是可以做到使产生的数字重复率很低,这样看起来好象是真正的随机数,实现这一功能的程序叫伪随机数发生器。
不管用什么方法实现随机数发生器,都必须给它提供一个名为“种子”的初始值。而且这个值最好是随机的,或者至少这个值是伪随机的。“种子”的值通常是用快速计数寄存器或移位寄存器来生成的。

下面是C语言里所提供的随机数发生器的用法。现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:
【1】首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
【2】然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间);
【3】根据需要多次调用rand(),从而不间断地得到新的随机数;
【4】无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。