如何产生不重复的随机数(50分)

  • 主题发起人 主题发起人 zpp218118
  • 开始时间 开始时间
Z

zpp218118

Unregistered / Unconfirmed
GUEST, unregistred user!
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('select * from 11');
open;
randseed:=datetimetotimestamp(now).Time;
//随机数种子,把时间转换为毫秒数=(时*60+分)*60*1000
randomize
//随机数产生器
while not eof do
begin
adoquery1.Edit;
adoquery1.Fields[1].Value:=random(adoquery1.RecordCount)
//Random 产生随机数
if adoquery1.Fields[1].Value=0 then
begin
adoquery1.Fields[1].Value:=random(adoquery1.RecordCount);
end;
next;
end;
end
看看我的代码有问题吗?
为什么不能产生不重复的随机数?
应该如何做呢?
 
代码没有问题。只是没法保证你的随机数不重复。
除非你每次测试你产生出来的数据,如果已经存在就重新生成,否则该随机数有效。
你是不是在做自动出题的系统?如果是,你就加上重复数据测试就可以。
 
网上抄的
以下源程序为1..36个数字,随机排列,产生不重复随机数。
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:=inttostr(i);

bb:=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;

aa:=aa[j];

aa[j]:=swapa;

end
//由此得到不重复的随机排列数字
 
我是做随机抽签
 
那就做对比,如果已经存在的就放弃重新生成。
 
把 1..adoquery1.RecordCount 存到一个 st:TStringList 中, 然后用 random(st.count) 随机抽取,每抽一个,就从 st 中删除一个。
 
关于随机数我想说一下,什么是随机数?随机数允许有重复嘛?多少次可以重复?
如果控制了不允许有重复的数出现,那我想,这个不是随机数了吧。我想至于楼主想的问题,那可以这么做,就是抽中的就删除了,然后在没有抽中的里面继续随机抽。没有必要考虑重复与否!
 
同意cqwty.
 
多人接受答案了。
 
后退
顶部