在VB中我现在用的rnd()这个函数都是假随机有哪位可以告诉我真随机应该怎么获取吗
热心网友
计算机中随机数的产生大家可能很多次讨论过随机数在计算机中怎样产生的问题,在这篇文章中,我会对这个问题进行更深入的探讨,阐述我对这个问题的理解。首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。那么计算机中随机数是怎样产生的呢?有人可能会说,随机数是由“随机种子”产生的。没错,随机种子是用来产生随机数的一个数,在计算机中,这样的一个“随机种子”是一个无符号整形数。那么随机种子是从哪里获得的呢?下面看这样一个C程序://rand01。c#includestatic unsigned int RAND_SEED;unsigned int random(void){ RAND_SEED=(RAND_SEED*123+59)%65536; return(RAND_SEED);}void random_start(void){ int temp[2]; movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4); RAND_SEED=temp[0];}main(){ unsigned int i,n; random_start(); for(i=0;i#include using namespace std;int main(){ unsigned int seed=5; srand(seed); unsigned int r=rand(); cout#include using namespace std;int main(){ srand((unsigned)time(NULL)); unsigned int r=rand(); cout#includeusing namespace std;int main(){ int rNum,m=20; char *ch=new char[m]; for ( int i = 0; i 从 1 到 m 的整数中(伪)随机取 n 个整数(容许重复):Private Sub Command1_Click()Dim m As Long, n As Long, i As Longm = 10n = 5For i = 1 To nRandomizePrint Int(Rnd * m + 1)Next iEnd Sub 对,没有真正的随机,我投“问知识人”一票!! 最简单的方法就是在程序开头加入randomize timer也就是从时钟取一个随机种子,然后再用rnd(0),可以得到(0,1)之间的随机单精度数字。 二楼正确,不存在真随机数,计算机里面的随机数都是通过某种算法计算出来的,无法实现自然界的真随机。算法是:首先取一个固定的数作为种子,带入随机数生成器,生成第一个随机数,再用第一个随机数作为种子,生成第二个随机数………………。你可以试一下,每次用rand生成的随机数序列是完全一样的。一楼说的先使用randomize是拿当时的系统时间做随机种子,这样可以保证每次生成的第一个数不一样,这样其实就是从前面说的那个随机数序列里面,从中间的某个由时间决定的随机位置开始作为第一个随机数,往后取得随机数列,可以达到比较随机。如果你是在一个循环里面取很多个随机数,每次都用randomize然后再用rnd的话,就可以认为生成的是一个真随机数列了。 Randomize 语句初始化随机数生成器。语法Randomize [number]可选的 number 参数是 Variant 或任何有效的数值表达式。说明Randomize 用 number 将 Rnd 函数的随机数生成器初始化,该随机数生成器给 number 一个新的种子值。如果省略 number,则用系统计时器返回的值作为新的种子值。如果没有使用 Randomize,则(无参数的)Rnd 函数使用第一次调用 Rnd 函数的种子值。注意 若想得到重复的随机数序列,在使用具有数值参数的 Randomize 之前直接调用具有负参数值的 Rnd。使用具有同样 number 值的 Randomize 是不会得到重复的随机数序列的。Randomize 语句示例本示例用 Randomize 语句初始化随机数生成器。由于忽略了数值参数, 所以 Randomize 用 Timer 函数的返回值作为新的随机数种子值。Dim MyValueRandomize ' 对随机数生成器做初始化的动作。MyValue = Int((6 * Rnd) + 1) ' 生成 1 到 6 之间的随机数值。Rnd 函数 返回一个包含随机数值的 Single。语法Rnd[(number)]可选的 number 参数是 Single 或任何有效的数值表达式。返回值如果 number 的值是 Rnd 生成 小于 0 每次都使用 number 作为随机数种子得到的相同结果。 大于 0 序列中的下一个随机数。 等于 0 最近生成的数。 省略 序列中的下一个随机数。 说明Rnd 函数返回小于 1 但大于或等于 0 的值。number 的值决定了 Rnd 生成随机数的方式。对最初给定的种子都会生成相同的数列,因为每一次调用 Rnd 函数都用数列中的前一个数作为下一个数的种子。在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器,该生成器具有根据系统计时器得到的种子。为了生成某个范围内的随机整数,可使用以下公式:Int((upperbound - lowerbound + 1) * Rnd + lowerbound)这里,upperbound 是随机数范围的上限,而 lowerbound 则是随机数范围的下限。注意 若想得到重复的随机数序列,在使用具有数值参数的 Randomize 之前直接调用具有负参数值的 Rnd。使用具有同样 number 值的 Randomize 是不会得到重复的随机数序列的。种子为初始值,用来生成伪随机数字。例如, Randomize 语句创建一种子值供 Rnd 函数使用,以接着创建唯一伪随机数列。以上摘自MSDN关于RND函数和Randomize 语句的解释,其中只谈及伪随机数,你所说真随机数未找到出处,供参考。 不随在真随机数 完毕 在form_load中加入randomize()就真随机了嘛热心网友
热心网友
热心网友
热心网友
热心网友
热心网友
热心网友