C++产生随机数的程序

C++产生随机数的程序,第1张

r = 20530 r + 138490; //这是两个有个是素数吧 应该是的 2053就是

//质因数分解13849=111259

//那么这两个素数的公倍数大于65535吧

//而65535是unsigned short两个字节吧

//这样递归 乘开后就能分散到(低2字节)所有0-65536的数字

这个随机产生办法的灵魂就在这句了:r = 20530 r + 138490

其实就是《线性同余法》 产生的随机数

线性同余法:一般递推公式为:Xn = (aX(n-1) + c)%M Rn = Xn/M

其中M为模数,a为常子(乘数),c为增量(加数),且均为非负整数

给定一组参数,就可以得到一列数,它是否具有类似于均匀随机变量的独立抽样序列的性质,与这些参数的选择有关例如,用下面的递推公式产生的随机数就是比较好的随机数:

a=235 c=0 M=0xFFF-21 种子x0小于M就行

s = (int)(r / 655360); //取整 得到高字(高2字节)部分的整数

r = r - s 655360; //去掉高字(高2字节)部分的整数 不细讲 分解就知道 明显

其实你会发现 上面3句后 s和r仍然为整数 下面假定r, s是unsigned int了

改写上面两句,就容易理解了:(去掉乘除法, 速度还能快一点)

r = r & 0xFFFF; //(一个语句解决,看明白了吧) r的值在0-65536之间

rnd = r / 655360; //655360使除法不进行整数除法 rnd是0和1之间 由上面一看就知道了

程序好一点的写法:

float MyRand(unsigned int seed=1)

{

static unsigned int _seed = seed& 0xFFFF; //第一次初始化种子

_seed = (2053 _seed + 13849) & 0xFFFF;

return (float)_seed / (float)(0xFFFF);

}

就这样吧

while(a)

{

case‘1‘

int n = rand()% 10;

break;

case‘1‘

int n = 10 + rand()% 100;

break;

case‘1‘

int n = 100 + rand()% 1000;

break;

}

刚写的程序,我的思想是用定时器加rand()随机函数来实现的,单片机上电之后通过按键去启动取随机数,若是单片机上电就立即取随机数的话,那每次上电随机的结果都是一样的。然后是0到9不重复的随机数,程序中用了循环来判断是否和前面取的随机数相同,相同则进入下次取随机数,不同则存入数组。程序如下:#include<reg52h>

#include<stdlibh> //包含rand()随机函数的头文件

unsigned char t,k,i,j,a,f,n[10];

//t是计时变量,k是按键标志,i是数组下标,f是随机数重复标志,n[10]是存放随机数的数组

void init() //初始化函数

{

t=0;

i=0;

f=0;

k=0;

TMOD=0x02; //设置定时器0为工作方式2

TH0=7; //装初值

TL0=7;

EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1; //启动定时0

EX0=1; //开外部中断0,同按键的效果一样

IT0=1; //下降沿触发

}

void main()

{

init();

while(1)

{

while(k) //外部中断0触发循环

{

if(!i) //i=0时取第一个随机数放入数组n[0]

{

srand(t); //随机数初始化

a=(char)(rand()%10); //取随机数(0~9)

n[0]=a; //存入数组

i++; //数组下标加1

}

else

while(i<10) //存放剩下的9个随机数

{

srand(t); //随机数初始化

a=(char)(rand()%10); //取随机数

for(j=0;j<i;j++) //与前面的随机数比较

{

if(n[j]==a) //与前面的随机数相同

f=1; //标志置1

}

if(f) //有重复执行

{

f=0; //标志清0

continue; //结束本次循环

}

n[i]=a; //不同则存入数组中

i++; //数组下标加1

}

}

}

}

void inter0() interrupt 0 //外部中断0

{

k=1; //按键标志置1,主函数执行取随机数

}

void time0() interrupt 1 //定时器0中断

{

t++; //时间加1

if(t==100) t=0;

}

以上就是关于C++产生随机数的程序全部的内容,包括:C++产生随机数的程序、如何编写一个产生随机数的程序、51单片机产生随机数c程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10085722.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存