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程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)