读书人

10000和37是什么关系?该如何处理

发布时间: 2012-02-23 22:01:34 作者: rapoo

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 在看《计算机程序设计艺术》第二卷啊,以后混分就不容易了,唯一知道的那点东西,大家都知道了。

读书人网 >软件架构设计

热点推荐