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

来源:百度知道 编辑:UC知道 时间:2024/05/31 13:39:04
呵呵!不要被我的问题吓到,不是要问太专业的计算机问题,下面说一下简单的例子。
记得中学时用过一种学习辅助型计算器(有别于商店里算账用的普通计算器,是有三角函数,科学计数法的那种),其中有一个操作是这样的;首先设置好取数范围,如:1—10,然后按一下确定键,这样每按一次确定键计算器就会随机给出1—10中的一个数,如此反复数百次,你就会发现每个数的出现几率都是1/10.(上概率课时老师教过这种验证方法)
这里要问的是计算器是如何在内部实现随机取数的?程序的最初设置者如何保证计算器的每次取数都具有代表性(公正)?
我给出我的一个设想:程序设置者给出一个循环程序,程序中包括X1、X2、X3……N个未知数,当输入取数范围是,程序自动把X1、X2、X3……一一定义。如X1—X10分别定义为1—10.然后循环程序在X1到X10中不断匀速运作(形象一点就是一个光标不断地在X1—X10中以每次0.001秒延迟的速率在其中循环游走),当使用者按下确定键时,光标在那个数字上那么就会输出那个数字,从而实现随机取数。
不知以上设想数否正确(接近),十分期待高手大虾们指点。说明是可以说的形象点,这样容易明白。
万分感谢!

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

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

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

那样是不行的,现在的电脑上一般都是伪随机数。
实际上当你取了很多以后会循环的(一般是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);
}

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

下面是C语言里所提供的随机数发生器的用法。现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:
【1】首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
【2】然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间);