LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: upcboy

简单问题(关于产生随机数)

[复制链接]
发表于 2003-12-8 14:27:27 | 显示全部楼层
仔细看,上下两段源码都一样,是产生随机数,当然结果就不同了。
发表于 2003-12-11 11:52:26 | 显示全部楼层
上次我把srand(seed)这个函数直接写到for循环里面了.导致常数种子生成的rand()随机数全部为相同的值,再次感谢home兄的提示.不过还是有个小问题没有解决.rand()生成的随机数是介于最大数和1之间,但是我希望能够生成的是6位数的随机数.也就是介于999999和100000之间.希望home再次不吝赐教!
发表于 2003-12-11 13:24:17 | 显示全部楼层
加个if判断是否是介于999999和100000之间的数.
发表于 2003-12-13 00:10:13 | 显示全部楼层
呵呵.这个方法是行,不过存在一个小问题.就是无法预料究竟可以生成多少个随机数.
发表于 2003-12-13 01:09:32 | 显示全部楼层
在if中加个基数器。a++;  或用数组。
int a=0;
if (rand >=999999 && rand <=100000 ) {
a++;
}

int a=0;
if (rand >=999999 && rand <=100000 ) {
array[a++]=rand;
}

刚学C,有很多不懂,上面的程序可能都写错了。但原理是这样,不对之处,请兄弟们更正
发表于 2003-12-13 02:27:31 | 显示全部楼层
自己写个随机数的子程序吧!给你一个随机数产生器:
16807产生器(Schrage方法)--一个公认的“最低标准”产生器
以下为一段代码:z1为种子,你自己可试试哪个种子好
#include<stdio.h>

long z2,z1;
float random()
{ long q,a=16807,m=2147483647,r;
float y;
q=m/a;r=m%a;
z2=a*(z1%q)-r*(z1/q);
if(z2<0)z2+=m;
y=z2/(float)m;
z1=z2;
return y;
}
main()
{float z;
long i;
  z1=1;
  for(i=0;i<2e5;i++)
  {z=random();
  printf("%lf\n",z);

  }
  getch();
  }
发表于 2003-12-13 15:18:14 | 显示全部楼层
thanks to yqh1203!!
发表于 2004-1-16 18:22:17 | 显示全部楼层
最初由 Andy84920 发表
一般是你要求的范围
EG:
你要产生随机数在1-10之间.
可以用           
                 int a;
                 srand(unsigned(time(0));//time(0)为rand()种下种子.
                 a=rand()%10+1;
                 这样变量a 就是1-10之间的有机数.
如果你不指定要产生的范围,它会用头文件定义的一个最大随机数来产生.你可以看看相关头文件它的定义!
如果不用srand();种下种子它产生的只是假随机数.并没有真正的实现随机机制.你可以看到每次运行程序产生的数据都一样.用srand()种下种子后就实现真正的随机了.


srand(unsigned(time(0));//time(0)为rand()种下种子.
这里要去掉unsigned才行。
发表于 2004-10-14 15:45:36 | 显示全部楼层

我觉得那个rand()函数很差,不均匀,有时我干脆用自然数来代替随机数。

速度更快,更均匀!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表