10000和37是什么关系?如下:BinaryHeap 是我的结构体,不用管他是什么,经过下面的代码,乱序插入了10000个数,
10000和37是什么关系?
如下:BinaryHeap 是我的结构体,不用管他是什么,经过下面的代码,乱序插入了10000个数,这代码是我改写国外一个大牛的,现在我想知道,10000和37是什么关系,为什么用37就能做到乱序插入,而且保证全部插入?知道这个道理,以后我做实验的时候就方便了.
C# code int numItems = 10000; BinaryHeap h = new BinaryHeap(); int i = 37; for (i = 37; i != 0; i = (i + 37) % numItems) { h.insert(new AnyType(i)); } Console.ReadLine();
[解决办法]这个是线性同余伪随机数,Xn+1 = (aXn+c)%m 这里a=1, c=37 m=10000
因为a=1, m和c互素,有m的周期,你换一个跟10000互素的素数应该也会有同样的效果
当然因为a=1,虽然能生成0 - 9999的所有数,而且有10000的周期,但生成的数列是没有随机性的。
代码里初始化i=37,即X0 = 37,根据公式有X-1 = 0,所以0要在第10000个数即X10000再出现。
但lz的代码遇到0就会退出for循环,0没有插入,所以应该只插入了9999个数吧。
[解决办法]相当不理解,学习
[解决办法]就是说 37*10000 % 10000 =0
[解决办法]生成随机序列的最简单方法就是线性同余法了,我们平时用的rand()就是用线性同余法来实现的。
对于线性同余法,其随机数生成式为:Yn=(a*Y(n-1)+c)%m。
序列{Yn}的周期长度为m,当且仅当:
1):c与m互素
2):令b=a-1,对整除m的每一个质因子,均是b的因子。
3):若m是4的倍数,则b也是4的倍数。
对此例,因为a=1,就不需要考虑条件2,3了(0是任何数的倍数)。只考虑条件1,即只要c与m互素即可。
不过,a=1这种特殊的随机序列的随机性其实很差,真正要自己写一个随机数发生器的话,把a取大一点比较好。
[解决办法]看来 oo 在看《计算机程序设计艺术》第二卷啊,以后混分就不容易了,唯一知道的那点东西,大家都知道了。