
#include<stdlibh>
#include<timeh>
void main()
{
srand(time(NULL));//产生随机数种子
rand() % 50 +1;//产生一个1~50以内的随机数
}#include <stdioh>
#include<stdlibh> //生成随机数用
#include<timeh> //利用时间生成种子
#include<mathh> //利用次方算2^(t-1)
//一共要写2^(t-1)行
void main()
{
int i;
long t,tem1,tem2;
scanf("%ld",&t);
t=pow(2,t-1);
srand((unsigned long)time(0)); //生成种子
for(i=1;i<=t;i++) //生成 2^(t-1)行随机数
{
tem1=rand()1000000/RAND_MAX; //生成第一个随机数
printf("%ld ",tem1); //打印
tem2=rand()1000000/RAND_MAX; //生成第二个随机数
while(tem2>tem1) //当第二个随机数大于第一个时,重新生成
tem2=rand()1000000/RAND_MAX;
printf("%ld\n",tem2); //打印第二个
}
return;
}1、C语言提供了一些库函数来实现随机数的产生。C语言中有三个通用的随机数发生器,分别为 rand函数, random函数, randomize 函数
2、但是rand函数产生的并不是真意正义上的随机数,是一个伪随机数,是根据一个数,称之为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a)。
3、在调用rand函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。一般用for语句来设置种子的个数。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);
}
就这样吧我这没装vc,据观察,有以下错误:
printf("%d ",j);中间没逗号;
srand不是这么用的
他是以一个种子去初始化随机数函数函数
一般可以用系统时间做种子
srand(time(0));
i=rand()%10;
但是这种方法有一个弊端,就是当你循环产生若干随机数时候,因为程序运行很快,系统时间变化很微小,导致有时候可能重复
所以可以这么写:
srand(time(0));
i=rand()%10;
for(int j=0;j<20;j++)
{
srand(i);
i=rand()%10;
printf("%d",i);
}
最后,别忘了用到系统时间的时候要引进头文件 #include "timeh"
我空间里有一片文章用来产生无重复的若干个随机数,不过代码是java的,思想在里面,建议去看看~~~~
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)