随机数的实现原理

http://en.wikipedia.org/wiki/Random_number_generation

The GLIBC random number generator讲了GLIBC中random()函数的实现原理,并给出了一段代码:

#include <stdio.h>

#define MAX 1000
#define seed 1

main() {
  int r[MAX];
  int i;

  r[0] = seed;
  for (i=1; i<31; i++) {
    r[i] = (16807LL * r[i-1]) % 2147483647;
    if (r[i] < 0) {
      r[i] += 2147483647;
    }
  }
  for (i=31; i<34; i++) {
    r[i] = r[i-31];
  }
  for (i=34; i<344; i++) {
    r[i] = r[i-31] + r[i-3];
  }
  for (i=344; i<MAX; i++) {
    r[i] = r[i-31] + r[i-3];
    printf("%d\n", ((unsigned int)r[i]) >> 1);
  }
}

时间: 2024-10-31 18:10:50

随机数的实现原理的相关文章

(c++11)随机数------c++程序设计原理与实践(进阶篇)

随机数既是一个实用工具,也是一个数学问题,它高度复杂,这与它在现实世界中的重要性是相匹配的.在此我们只讨论随机数哦最基本的内容,这些内容可用于简单的测试和仿真.在<random>中,标准库提供了复杂的方法来产生适应不同数学分布的随机数.这一随机数标准库基于下面两个基础概念: 发生器(engine,随机数发生器):发生器是一个可以产生均匀分布整形值序列的函数对象. 分布(distribution):分布是一个函数对象,给定一个发生器产生的序列作为输入,分布可以按照相应数学公式产生一个值的序列.

随机数是骗人的,.Net、Java、C为我作证

差点儿全部编程语言中都提供了"生成一个随机数"的方法,也就是调用这种方法会生成一个数,我们事先也不知道它生成什么数.比方在.Net中编写以下的代码: Random rand = newRandom(); Console.WriteLine(rand.Next()); 执行后结果例如以下: Next()方法用来返回一个随机数.相同的代码你执行和我的结果非常可能不一样,并且我多次执行的结果也非常可能不一样,这就是随机数. 一.陷阱 看似非常easy的东西,使用的时候有陷阱.我编写以下的代码

随机数是骗人的,.Net、Java、C为我作证(转载)

几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数,我们事先也不知道它生成什么数.比如在.Net中编写下面的代码: Random rand = newRandom(); Console.WriteLine(rand.Next()); 运行后结果如下: Next()方法用来返回一个随机数.同样的代码你执行和我的结果很可能不一样,而且我多次运行的结果也很可能不一样,这就是随机数. 一.陷阱 看似很简单的东西,使用的时候有陷阱.我编写下面的代码想生成100个随

一、解密随机数生成器(1)——真随机数生成器(转)

解密随机数生成器(1)--真随机数生成器 从小就一直很好奇,MP3播放器的随机播放功能是如何实现的,今天读到一篇关于随机数的文章,又勾起了我的那时好奇心,索性上下求索,了解了随机数背后的很多知识,顿觉豁然开朗,特意写这篇文章和大家总结分享一下. 其实,随机数在我们身边无处不在.无论是玩扑克牌麻将骰子时的点数,玩LOL时的玩家匹配,还是高大上的量子物理,核聚变,都无一例外地随机数有关,在混沌理论中,这个世界本身就是一系列随机过程的产物--好吧,有点激动,扯得太远了--作为编程爱好者,应该会发现,每

(转)随机数是骗人的,.Net、Java、C为我作证

(转载自: http://www.cnblogs.com/rupeng/p/3723018.html ) 几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数,我们事先也不知道它生成什么数.比如在.Net中编写下面的代码: Random rand = newRandom(); Console.WriteLine(rand.Next()); 运行后结果如下: Next()方法用来返回一个随机数.同样的代码你执行和我的结果很可能不一样,而且我多次运行的结果也很

随机数是骗人的,.Net、Java、C为我作证(转)

几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数,我们事先也不知道它生成什么数.比如在.Net中编写下面的代码: Random rand = newRandom(); Console.WriteLine(rand.Next()); 运行后结果如下:   Next()方法用来返回一个随机数.同样的代码你执行和我的结果很可能不一样,而且我多次运行的结果也很可能不一样,这就是随机数. 一.陷阱 看似很简单的东西,使用的时候有陷阱.我编写下面的代码想生成100

Java基础 —— Java常用类

Java常用类: java.lang包: java.lang.Object类: hashcode()方法:返回一段整型的哈希码,代表地址. toString()方法:返回父类名+"@"+哈希码(一般用于覆盖). equals()方法:返回"=="操作的布尔值(一般用于覆盖). finalize()方法:用于对象的销毁(不受人为控制,由JVM调用,遵从垃圾回收机制). clone()方法:用于对象之间的拷贝(深拷贝). getClass()方法:返回对象的字节码文件对

很好奇的随机函数rand()君

在函数速查上看到的rand()君: 1 #include <stdlib.h> 2 #include <stdio.h> 3 4 int main(void) 5 { 6 int i; 7 8 printf("Ten random numbers from 0 to 99\n\n"); 9 for(i=0; i<10; i++) 10 printf("%d\n", rand() % 100); 11 return 0; 12 } 可产生

DSP网络子系统

1.  基本架构 网络协处理器(NETCP)有四个主要的模块,分别是PKTDMA控制器.包加速器(PA).安全加速器(SA).GbE交换子系统.这些模块通过包数据流交换部件连接.如图 1.1所示: 图 1.1  网络协处理器功能块图 1.1  时钟控制 网络协处理器有三个主时钟域,分别是PA.SA.GbE交换子系统.这三个时钟域都共享一个公共的时钟源,通常为350MHz.在使用PA.SA或GbE交换模块之前,必须启用各自的时钟域.在某些设备中,这个时钟可以由锁相环产生. NETCP也有辅助时钟,