除了时间做随机种子产生随机数之外,还有没有别的方法?

netxuning 2006-12-11 06:35:05
时间做种时,在程序运行很快的情况下,循环产生的随机数都一样!
怎么办?
...全文
1098 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
levin9 2006-12-13
  • 打赏
  • 举报
回复
GUID也可以呀,ms保證60年不會有重複數據。
netxuning 2006-12-12
  • 打赏
  • 举报
回复
晨星大哥厉害!!!!!!!
Bennyatt 2006-12-12
  • 打赏
  • 举报
回复
来来来 都说说 srand() 还能加什么参数 我想学习学习~~~~写标准参数,别写汉字。。。
来来来 都说说 srand() 还能加什么参数 我想学习学习~~~~写标准参数,别写汉字。。。
来来来 都说说 srand() 还能加什么参数 我想学习学习~~~~写标准参数,别写汉字。。。
来来来 都说说 srand() 还能加什么参数 我想学习学习~~~~写标准参数,别写汉字。。。
来来来 都说说 srand() 还能加什么参数 我想学习学习~~~~写标准参数,别写汉字。。。
来来来 都说说 srand() 还能加什么参数 我想学习学习~~~~写标准参数,别写汉字。。。
来来来 都说说 srand() 还能加什么参数 我想学习学习~~~~写标准参数,别写汉字。。。
来来来 都说说 srand() 还能加什么参数 我想学习学习~~~~写标准参数,别写汉字。。。
晨星 2006-12-12
  • 打赏
  • 举报
回复
那可能就只能这样了。:(
void randfun() {
static int initialized = 0;
if(!initialized) {
srand(time(0));
initialized = 1;
}
……
}
晨星 2006-12-12
  • 打赏
  • 举报
回复
哦,对不起,没看清楚,你用的是C语言。- -b。
我以为C++了,C语言中只能用常量初始化static量。
netxuning 2006-12-12
  • 打赏
  • 举报
回复
再问晨星:
我照着你说的做了:
int initrand() {
srand(time(0));
return 0;
}

函数中:
static int nouse = initrand();

但是编译出错:
initializer element is not constant

我的编译器是:gcc 3.2.3
netxuning 2006-12-11
  • 打赏
  • 举报
回复
真是太谢谢了!
yuanhan530 2006-12-11
  • 打赏
  • 举报
回复
srand(time(0));
rand();
这样生成的随机数相的的概率不大啊,
晨星 2006-12-11
  • 打赏
  • 举报
回复
你也可以用点小技巧,仍把它“封装”到你的函数中,比如:
int initrand() {
srand(time(0));
return 0;
}

void randfun() {
static int nouse = initrand();
……
}
这样,利用static变量只被初始化一次的特性,就不用提到外边去了,不要让外边知道函数内部实现方面的细节。
晨星 2006-12-11
  • 打赏
  • 举报
回复
嗯,是的。
基实,rand,严格意义上应该叫做“伪随机序列发生器”,就是用来产生一组伪随机数的。
netxuning 2006-12-11
  • 打赏
  • 举报
回复
to steedhorse(晨星)
既然你在那么短的时间间隔内要产生多个伪随机数,那为啥一定要初始化多次呢?一次不好么?
========================================================
我明白你的意思了,我确实在每次产生一个随机数的时候都进行了一次srand(time(0));

因为我是用for循环调用一个函数
这个函数内部产生随机数,包括srand(time(0));所以没次都初始化了一次.
for(i = 0; i < 100; ++i)
randfun(); //内产生一个随机数

如果要改的话,
srand(time(0));
for(i = 0; i < 100; ++i)
randfun(); //该函数内的srand(time(0))去掉,只留下rand()就可以了吗?
柯本 2006-12-11
  • 打赏
  • 举报
回复
有关随机数的一篇文章:
http://www-128.ibm.com/developerworks/cn/security/playing/index.html
另外,记得传说中新的Intel的CPU里面添加了生成随机数的指令,是通过CPU内部的热噪声电压取得的,应该产生的完全是随机数了。(不过资料找不到了)
  • 打赏
  • 举报
回复
打开自身exe,在随机位置读入一个int作为种子。
晨星 2006-12-11
  • 打赏
  • 举报
回复
哦,也不是完全不可能,只是概率非常小。
晨星 2006-12-11
  • 打赏
  • 举报
回复
srand(time(0));
for(int i = 0; i < 100; ++i)
cout << rand() << endl;

怎么可能重复呢?
晨星 2006-12-11
  • 打赏
  • 举报
回复
既然你在那么短的时间间隔内要产生多个伪随机数,那为啥一定要初始化多次呢?一次不好么?
netxuning 2006-12-11
  • 打赏
  • 举报
回复
谢谢了
clock()试了,还是一水相同的随机数,也许是我用的方法不对

要sleep(1)后才能产生不同的随机数!

呵呵,用专门的硬件还没那条件!
axx1611 2006-12-11
  • 打赏
  • 举报
回复
用专门的硬件~~~
晨星 2006-12-11
  • 打赏
  • 举报
回复
有是有,但都不如时间那么方便简洁,比如键盘,鼠标的敲击频率,网络流量统计值等,甚至可以专门设计一块芯片插到电脑上,专门用来产生安全随机数。

还有,你可以用clock,不要用time,前者的单位比秒还小得多。

最后,如果时间间隔比较短,当然初始化一次就行了,别每次都初始化。
delphi产生随机数2009-07-27 18:58//用delphi产生不重复的随机数 ****************************************************************************************** var aa : array[1..36] of string[2]; //aa数组为需要随机排列的数组,{先把1..36按顺序给aa数组赋值} procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin for i:=1 to 36 do begin aa[i]:=inttostr(i); bb[i]:=inttostr(i); end; end; {随机进行排列} procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; swapa:string[2]; begin randomize; //随机数初始化*一定要有,不然下次运行时候产生的随机数仍然和这次相同* for i:=1 to 36 do begin j:=1+random(36); swapa:=aa[i]; aa[i]:=aa[j]; aa[j]:=swapa; end; //由此得到不重复的随机排列数字 ***************************************************************************************** 如何产生34-456之间的随机数 Randomize; 34+Random(456-34+1); ×××××××××××××××××××//下面是扫雷游戏的一个编法 procedure TForm1.Button1Click(Sender:TObject); begin Randomize; Memo1.Lines.Add(IntToStr(Random(20))); end; ×××××××××××× ***************************************************************************************** 随机数相关的几个函数: 1、RandSeed;//随时机数发生的“种子”。如果不赋值那么每次执行产生的随机数列是一样的。 所以该值必须每次调用均应是不同值。 2、Randomize;//用当前机器时间作为“种子”初始化随机数发生器。 3、Random() ;//由“种子”初始化的随机数出发,开始产生随机数序列 但是Delphi中的Random()产生的是伪随机数,也就是说,程序的两次运行,Random()产生的随机数是一样的。 先运行一下Randomize,再Random就是真正的随机数了 即: Randomize //初始化随机数发生器 Random() ********************************************************************************************* delphi 如何产生不重复随机数 pascal里的随机数 随机数是指理论上没有规律可循、在指定范围内每个数的出现几率相等、无法根据之前的数来预测下一个数的数列。一般随机数生成器的基本原理是:首先初始化一个随机种子,其初始值可以是任意的整数;在每次获取随机数时,以随机种子为基础进行某种特殊的运算,获得一个随机数并返回之,然后再对随机种子进行某种运算,改变随机种子的值。这样,就可以生成许多比较随机的数,但同一个初始值的随机种子将会生成完全相同的随机数列。 Pascal的System单元提供了两个与随机数有关的子程序:Randomize和Random。 Randomize过程用于初始化随机种子,其初始值取决于当前的系统时钟。 Random函数用于获取随机数 它有两种调用形式: Random,返回一个0到1之间(不包括1)的随机实数; Random(N),返回0至N之间(不包括N)的随机整数,N为Word类型整数。 另外,System单元中随机种子变量的标识符为RandSeed,你也可以手动修改它。随机数在信息学奥林匹克中可用于随机化搜索、穷举等算法,以优化其性能,也可用于在快速排序中选择关键数,以使其快速排序算法的最坏情况没有固定的相应数列。如果你希望使用了随机数的程序对同一个输入数据能有恒定的输出结果,可以设置RandSeed为一个定值。 ************************************************************************************************* 一个变态小算法 ******************************* 比较耗费机时,如果产生的数目少,就不要用这个算法了。 计算的是在一个范围内(如1-1000),随机抽取n个不相等的随机数。我的思想就是先定义一个用来存放的数组(这当然是必须的啦,废话),然后定义了一个二维数组(感觉很浪费空间),这个二维数组是用来存放已经生成随机数的范围,当然不是随意存放了,要按照自然顺序,但这还不必要定义二维的。二维主要是存放一个范围,即某一列的第一行存放的是范围的小值,而第二行存放的是范围的大值。这样新生成的随机数肯定是在范围之外的,因为范围是已生成随机数的范围啊。这样,每次取随机数时,先随机抽取在某两个范围数组值之间,再在这两个范围数组值之间取随机数。基本上就是这样了。 public class random { int count=500; //个数 int min=1; //最小值 int max=1000; //最大值 int[] r=new int[count]; //随机数存储数组 int[][] k=new int[2][count+2]; //存储范围数组,用于判断范围值 //一维数组用来存放范围的小值,二维用来存放大值 int l=0; //存储空间大小 public random() //初始化范围 {k[0][0]=min-1; k[1][0]=min-1; k[0][2]=max+1; k[1][2]=max+1; l=3; } public int ran(){ //来一个可以制造随机整数的东西 return (int)(Math.random()*1000000000); } public void p(int x,int c) //用来比较存储数组 { for(int i=0;ii;j--){ //后移数组为插入值留个位置 k[0][j]=k[0][j-1]; k[1][j]=k[1][j-1]; } k[0][i]=x; //插入值 k[1][i]=x; l++; if (k[0][i]-k[1][i-1]==1) //如果插入值与前一个范围值相差1,则与前一个值合并 {k[1][i-1]=k[1][i]; move(l-1,i); l--;} break; }} } } public void move(int m,int n) //与前一个范围值合并的函数 { for(int j=n;j2) z=ran()%(l-2); //判断有多少个空隙,就是有多少个范围,然后随机选取一个 else z=0; r[i]=ran2(k[0][z+1],k[1][z]); //在选取的范围中制造随机数 p(r[i],i); } } public int ran2(int x,int y){ //在固定范围内制造随机数 int m=x-y; m=ran()%(m-1); return m+y+1; } /*public static void main(String[] args) { random rr=new random(); rr.r(); for(int i=0;i
LINGO是用来求解线性和非线性优化问题的简易工具。LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。 §1 LINGO快速入门 当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口: 外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。下面举两个例子。 例1.1 如何在LINGO中求解如下的LP问题: 在模型窗口中输入如下代码: min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后点击工具条上的按钮 即可。 例1.2 使用LINGO软件计算6个发点8个收点的最小费用运输问题。产销单位运价如下表。 单 位 销地 运 价 产地 B1 B2 B3 B4 B5 B6 B7 B8 产量 A1 6 2 6 7 4 2 5 9 60 A2 4 9 5 3 8 5 8 2 55 A3 5 2 1 9 7 4 3 3 51 A4 7 6 7 3 9 2 7 1 43 A5 2 3 9 5 7 2 6 5 41 A6 5 5 2 2 8 1 4 3 52 销量 35 37 22 32 41 32 43 38 使用LINGO软件,编制程序如下: model: !6发点8收点运输问题; sets: warehouses/wh1..wh6/: capacity; vendors/v1..v8/: demand; links(warehouses,vendors): cost, volume; endsets !目标函数; min=@sum(links: cost*volume); !需求约束; @for(vendors(J): @sum(warehouses(I): volume(I,J))=demand(J)); !产量约束; @for(warehouses(I): @sum(vendors(J): volume(I,J))<=capacity(I)); !这里是数据; data: capacity=60 55 51 43 41 52; demand=35 37 22 32 41 32 43 38; cost=6 2 6 7 4 2 9 5 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3; enddata end 然后点击工具条上的按钮 即可。 为了能够使用LINGO的强大功能,接着第二节的学习吧。 §2 LINGO中的集 对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。 现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。 2.1 为什么使用集 集是LINGO建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。 2.2 什么是集 集是一群相联系的对象,这些对象也称为集的成员。一个集可能是一系列产品、卡车或雇员。每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。属性值可以预先给定,也可以是未知的,有待于LINGO求解。例如,产品集中的每个产品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等等。 LINGO有两种类型的集:原始集(primitive set)和派生集(derived set)。 一个原始集是由一些最基本的对象组成的。 一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。 2.3 模型的集部分 集部分是LINGO模型的一个可选部分。在LINGO模型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:”开始,以“endsets”结束。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个集及其属性

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧