|
![]() | 作者: Ocean [friendship]
![]() |
登录 |
我搜索到“线性同余”法,大概就是就这样的一个公式代码:r = (r*a + c)%m; //a,c,m为常数 可是我不明白,这样一个公式能产生随机数吗? 请教高手这个函数应该怎样写啊? 我是新手!先谢了! |
地主 发表时间: 06-11-14 17:21 |
![]() | 回复: kert_t8 [kert_t8] ![]() |
登录 |
其实我们说的随机数都是伪随机数。而伪随机数又是从伪随机数序列里面来的。什么意思呢,就是说一个数列,这个数列里面相邻的两个数是没有规律的,并且距离足够远。这样的话,我们就可以把一个随机数生成看作是一个关于一个伪随机数序列数组的下标(或者说是序号)的函数。 你给的那个公式,其实应该理解成 R[n+1] = (R[n]*a+c)%m 对于某一个特定的a,c,m的组合而言,这是一个数列的递推公式,通过这个递推公式得到的数列是一个伪随机数列。其实就是这个意思。 p.s 这个东西的数学原理我也不明白,我觉得如果不是研究这方面的东西,也不需要搞得太明白 ![]() |
B1层 发表时间: 06-11-15 16:32 |
![]() | 回复: jhkdiy [jhkdiy] ![]() |
登录 |
要自己写吗?VC里本身就有提供啊: 使用rand函数获得随机数。rand函数返回的随机数在0-RAND_MAX(32767)之间。 例子: 代码: 在调用这个函数前,最好先调用srand函数,如srand( (unsigned)time( NULL ) ),这样可以每次产生的随机数序列不同。 如果要实现类似0-1之间的函数,可以如下: double randf() { return (double)(rand()/(double)RAND_MAX); } 如果要实现类似Turbo C的random函数,可以如下: int random(int number) { return (int)(number/(float)RAND_MAX * rand()); } |
B2层 发表时间: 06-11-16 13:21 |
![]() | 回复: 286 [unique] ![]() |
登录 |
所谓随机数,就是没有上下文的数。 理论上,我们有很多方法可以产生随机数。 比如:楼主所说的“线性同余”法,读取当时时间的毫秒值法,读取内存或文件中某些连续字节再进行操作。 但实际中,由于算法本身,或硬件本身的限制,使得所得的数并不随机,而且会出现周期性循环,或数据达到一定规模后出现某种规律。 线性同余法的原理“月之御者”已说的很清了。这种方法有个缺点,就是需要用户提供一个“种子”,就是数列的初始值。有了种子,可以产生不同的数列,但相同的种子,却产生相同的随机数列,这是他的缺点。为了弥补这一缺点,人们常常把种子设为与时间有关,这样,时间变了,随机数就是变了。 回到主题上: r = (r*a + c)%m; //a,c,m为常数 比如,假设a=3,c=2,m=10(一般来说,a和m要互质,当然,a,c,m实际使用时不可能这么简单): 种子r=1时,此后产生的随机数序列就是: 5,8,1,5,8,1..... 种子r=2时,此后产生的随机数序列就是: 8,1,5,8,1,5..... 这样,虽然,只产生了5,8,1这三个数,但三者之间似乎是随机的。 |
B3层 发表时间: 06-11-22 15:52 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号