从软件的角度来说,如果是电脑占卜,需要用随机数,电脑里的随机数是假随机数。经过这么多年的编程,我还没有我没见过任何能产生真随机数的东西。
但是随机数可以通过光子纠缠产生。
根据现代科学的定义,产生真随机数至少有两个条件:
1.真随机数序列是不可预测的,不可能重复生成两个相同的真随机数序列。
2.真正的随机数只能由一些随机的物理过程产生。比如:放射性衰变、电子设备的热噪声、宇宙射线的触发时间等。
在计算机中,为了满足信息熵的特性,经常使用信息源,包括用户和信息源人的反应或者一系列排列变形后的高频时钟,或者用户路径的坐标的鼠标移动,这在一般程序中很少触及,在我看来。因此,计算机上的占卜聚会让我们不谈如何处理真随机数,以及如何在获得真随机数时改变它们。再深入一点,就需要讲世界的本质之类的哲学命题,暂且不提。就现在的占卜程序主要是线上来说,和时间相关的占卜可能还是可以商量的。但不适合随机性要求强的占卜。
1.如何产生一定范围内的随机数?
直接的方法是:
rand()%n
返回一个从0到n-1的数字。但是这种方法不好,因为很多随机数生成器的低阶位都不是随机的。更好的方法是:
(int)((double)rand()/((double)rand_max1)*n)
如果你不t想用替身,另一种是:
rand()/(rand_max/n^1)
两种方法都需要知道rand_max,并且假设n比rand_max小很多。ansi规定标准头文件stdlib.h包含rand_max的#define。对了,rand_max是一个常数,它告诉你c库函数rand()的固定范围。你可以不要将rand_max设置为其他值,您可以t要求rand()返回其他范围内的值。如果您使用的随机数生成器返回0到1的浮点数。值,要得到0到n-1范围内的整数,只需将随机数乘以n。
2.为什么每次执行程序时rand()都以相同的顺序返回数字?
可以调用srand()来初始化伪随机数生成器的种子。传递给srand()的值应该是一个实随机数,比如当前时间:
#包含ltstdlib.hgt
#包含lttime.hgt
srand((unsignedint)time((time_t*)null))
请注意,在程序执行过程中多次调用srand()并不一定有帮助!唐每次调用rand()之前,不要调用srand()来获取a"真随机数"!
我需要随机的真/假值,所以我直接使用rand()%2,但是我得到的是交替的0,1,0,1,0。
这是一个很差的伪随机数发生器,低位不随机!不幸的是,一些系统提供了这样的伪随机数发生器。请尽量使用高阶位,详见本文第1点。
利用excel随机函数实现一定范围内数据的随机变化。
1.打开excel程序,在任意单元格中输入公式rand()*(100-10)10,excel会生成一个10-100随机数。其中所述rand函数生成大于0且小于1的随机数。
2.如果想要某个区间的随机整数,可以用randbetween函数来实现。在任意单元格中输入公式randbetween(10,100)将生成一个介于10和100之间的随机整数,其中第一个参数是要返回的最小整数。number,第二个参数是要返回的最大整数,两个参数缺一不可。