随机数生成原理实现方法不同编程语言的随机数函数

上传人:宝路 文档编号:6804386 上传时间:2017-09-14 格式:DOC 页数:28 大小:112KB
返回 下载 相关 举报
随机数生成原理实现方法不同编程语言的随机数函数_第1页
第1页 / 共28页
随机数生成原理实现方法不同编程语言的随机数函数_第2页
第2页 / 共28页
随机数生成原理实现方法不同编程语言的随机数函数_第3页
第3页 / 共28页
随机数生成原理实现方法不同编程语言的随机数函数_第4页
第4页 / 共28页
随机数生成原理实现方法不同编程语言的随机数函数_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《随机数生成原理实现方法不同编程语言的随机数函数》由会员分享,可在线阅读,更多相关《随机数生成原理实现方法不同编程语言的随机数函数(28页珍藏版)》请在金锄头文库上搜索。

1、1-0:Microsoft VC+ 产生随机数的原理:Srand ( )和 Rand( )函数。它本质上是利用线性同余法,y=ax+b(mod m)。其中 a,b,m 都是常数。因此 rand 的产生决定于 x,x 被称为 Seed。Seed 需要程序中设定,一般情况下取系统时间作为种子。它产生的随机数之间的相关性很小,取值范围是 032767(int ) ,即双字节(16 位数) ,若用 unsigned int 双字节是 65535,四字节是 4294967295,一般可以满足要求。1-1: 线性同余法:其中 M 是模数,A 是乘数,C 是增量,为初始值,当 C=0 时,称此算法为乘同余法

2、;若C0,则称算法为混合同余法,当 C 取不为零的适当数值时,有一些优点,但优点并不突出,故常取 C=0。模 M 大小是发生器周期长短的主要标志,常见有 M 为素数,取 A 为 M的原根,则周期 T=M-1。例如:a=1220703125 a=32719 (程序中用此组数) a=16807 代码:void main( )const int n=100;double a=32719,m=1,fn+1,gn,seed;m=pow(2,31);coutseed;f0=seed; for(int i=1;i& vec, const int num)srand(time(NULL);vector v;i

3、nt size = num;for(int i = 1; i :iterator it = v.begin();int n = rand() % (size-);it += n;vec.push_back(*it);v.erase(it);但是由于 vector 删除效率很低,所以这个算法在 10W 的时候已经不可接受了,需要 17 秒左右,后来在网上看到有朋友提出了另一种算法,感觉不错,于是又测试了一下void Gen(vector& vec, const int num)srand(time(NULL);for(int i = 0; i x=0,if ( ( pMaskidx / 8 &

4、maskArridx % 8) =0) / pBuffx 没有存储过任何数pMaskidx / 8 |= maskArridx % 8;/ 置 1pBuffidx=i;i+;/-delete pMask;delete pBuff;int main(int argc, char* argv)DWORD t=GetTickCount();test(1000000);t=GetTickCount()-t;printf(It take %d msn,t);return 0;Java 中随机数生成的几种方法java 产生随机数的几种方式 在 j2se 里我们可以使用 Math.random()方法来产生

5、一个随机数,这个产生的随机数是 0-1 之间的一个 double,我们可以把他乘以一定的数,比如说乘以 100,他就是个 100 以内的随机,这个在 j2me 中没有。 在 java.util 这个包里面提供了一个 Random 的类,我们可以新建一个 Random 的对象来产生随机数,他可以产生随机整数、随机 float、随机 double,随机 long,这个也是我们在 j2me 的程序里经常用的一个取随机数的方法。 在我们的 System 类中有一个 currentTimeMillis()方法,这个方法返回一个从 1970 年 1月 1 号 0 点 0 分 0 秒到目前的一个毫秒数,返回

6、类型是 long,我们可以拿他作为一个随机数,我们可以拿他对一些数取模,就可以把他限制在一个范围之内啦 其实在 Random 的默认构造方法里也是使用上面第三种方法进行随机数的产生的 对于方法二中的 Random 类有以下说明: java.util.Random 类有两种方式构建方式:带种子和不带种子 不带种子: 此种方式将会返回随机的数字,每次运行结果不一样 public class RandomTest public static void main(String args) java.util.Random r=new java.util.Random(); for(int i=0;i(

7、被包含于中)提供两个帮助生成伪随机数的函数:函数一:int rand(void);从 srand (seed)中指定的 seed 开始,返回一个seed, RAND_MAX(0x7fff))间的随机整数。函数二:void srand(unsigned seed);参数 seed 是 rand()的种子,用来初始化 rand()的起始值。可以认为 rand()在每次被调用的时候,它会查看:1) 如果用户在此之前调用过 srand(seed),给 seed 指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值。2) 如果用户在此之前没有调用过 srand(seed),它会自动

8、调用 srand(1)一次。根据上面的第一点我们可以得出:1) 如果希望 rand()在每次程序运行时产生的值都不一样,必须给 srand(seed)中的seed 一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。2) 否则,如果给 seed 指定的是一个定值,那么每次程序运行时 rand()产生的值都会一样,虽然这个值会是seed, RAND_MAX(0x7fff))之间的一个随机取得的值。3) 如果在调用 rand()之前没有调用过 srand(seed),效果将和调用了 srand(1)再调用rand()一样( 1 也是一个定值)。举几个例子,假设我们要取得 0

9、6 之间的随机整数(不含 6 本身):例一,不指定 seed:for(int i=0;i/srand(unsigned)time(0);for(int i=0;i#include #include using namespace std;int main()double random(double,double);srand(unsigned(time(0);for(int icnt = 0; icnt != 10; +icnt)cout #include #include #include using namespace std;int main()double random(double,

10、double);int a10 = 0;const int Gen_max = 10000000;srand(unsigned(time(0); for(int icnt = 0; icnt != Gen_max; +icnt)switch(int(random(0,10)case 0: a0+; break;case 1: a1+; break;case 2: a2+; break;case 3: a3+; break;case 4: a4+; break;case 5: a5+; break;case 6: a6+; break;case 7: a7+; break;case 8: a8+

11、; break;case 9: a9+; break;default: cerr #include #include /使用当前时钟做种子void main( void )int i;srand( (unsigned)time( NULL ) ); /初始化随机数for( i = 0; i #include #include main( )int i;srand( (unsigned)time( NULL ) ); for( i = 0; i #include #include main( )int i;srand( (unsigned)time( NULL ) ); for( i = 0;

12、i #include int main(void) int i; printf(Ten random numbers from 0 to 99nn); for(i=0; i #include #include /* prints a random number in the range 0 to 99 */ int main(void) randomize(); printf(Random number in the 0-99 range: %dn, random (100); return 0; 函数名: randomize 这个比较好!功 能: 初始化随机数发生器 用 法: void ra

13、ndomize(void); 程序例: #include #include #include int main(void) int i; randomize(); printf(Ten random numbers from 0 to 99nn); for(i=0; i #include #include#include swap(int *pm,int *pn) /*必须用指针进行交换 */int temp;temp=*pm;*pm=*pn;*pn=temp;int main(void)int i,a513;/*int *pa,*pb;*/srand( (unsigned)time( NUL

14、L ) ); /*定义这个可以产生不同的随机数*/for(i=1; i=1; i-)/* pa=&ai; pb=&arand()%i+1;*/swap(&ai, &arand()%i+1); /*加一是从一到 i 的随机,就不会包含 0*/*不用再定义指针,这样结论是一样的 */printf(n) ;for(i=1; i #include #includeint main(void)int a100=0; int i,m;for(i=1; i#include #include using namespace std;/this struct represents an location.typ

15、edef struct int x;int y; Pair;class Gridprivate :Grid(const Grid& g);public:Pair * m_data;const int m_width; /grid widthconst int m_height; /grid heightint * m_adjacent; /memory array/constructor with width and height of the grid.Grid(int x, int y):m_width(x), m_height(y)m_data = new Pairx*y; memset(m_data, 0, x*y *sizeof(Pair);m_adjacent = new intx*y; memset(m_adjacent, -1, x*y *sizeof(int);/free resourceGrid()delete m_data;delete m_adjacent;int Bi

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号