请问,如何从1到938随机选取 100 个不重复的随机数 ( 积分: 33 )

  • 主题发起人 主题发起人 星幻子
  • 开始时间 开始时间

星幻子

Unregistered / Unconfirmed
GUEST, unregistred user!
跪求了!!!!!!!!!!
 
跪求了!!!!!!!!!!
 
for i:=0 to 1000 do
a:=i;
for i:=0 to 99 do
begin
b:=a[rand(1000-i)];//从0..1000中选个数,随机函数可能有错,自己改一下
a[b]:=a[1000-i];//踢掉已经选取的数
end;
//b即为你所需要数组
 
问题
b在上面的代码中好象只进行一次随机赋值
a[b]:=a[1000-i];
这一句好象只是对a数组进行赋值,怎么踢掉?
 
哈哈,我搞定了,发上来大家分享分享
I,J: Integer;
X,A: TStringList;
begin
X := TStringList.Create;
For I := 1 to 938 do
X.Add(IntToStr(I))
//先将1到938赋给TStringList
Randomize;
For I := 1 to 100 do
begin
J := Random(938-(I-1))
//然后随机选取一个数做为选取X中数值的Index
A.Add(X.Strings[J])
//将选中的数添加至另一个TStringList
X.Delete(J)
//删除被选中的数,这样以后就不会再次被选中 了
end


哈哈~~~
 
To 星幻子 兄弟:
1、个人觉得,你的方法能保证取的数不重复,但是每次取随机数的范围在不断缩小,而这个过程最后竟然是在 0—838 取数;
2、也许 900 多个数看不出什么,但如果是在 1—150之间取数呢,可能随机的效果就不明显了。
 
大意了,不好意思。从新帖过。这次调试过了。。。
for i:=0 to 9 do
begin
s:=random(10-i);
b:=a;//从0..9中选个10数
a:=a[9-i];//踢掉已经选取的数
end;
 
to vvyang:你的理解是错误的

初学者1号的方法更好一些:
for i:=0 to 9 do
begin
s:=random(10-i);
b:=a;//从0..9中选个10数
a:=a[9-i];//踢掉已经选取的数
end;
只是从0到N-1种取数,每个结果要+1就满足楼主的要求了
 
var
strList:TStringList;
begin
strList:= TStringList.Create;
Randomize;
for i:=0 to 100 do
strlist:=random(938);
end;

其实这样是一个伪随机数!没有达到真正的随机!
 
我觉得应该这么比较好。第一次从1-938中选择一个随机数。比如说500
然后从1-938这个数的集合中去掉500这个数,剩下937个数。第二次从1-937选择一个随机数,比如说是600,就表示从这937个数集中的第600个数,也就是601。直到最后,不知道程序怎么写
 
我的也有效,好看懂吧?给分!
for i := 0 to 9 do
a:=i;

Randomize;
for i := 0 to 888 do
begin
n1:=random(10);
n2:=random(10);
ntmp:=a[n1];
a[n1]:=a[n2];
a[n2]:=ntmp;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
i: string;
begin
Randomize;
while (Memo1.Lines.Count < 100 ) do
begin
i := IntToStr(Random(938));
if Memo1.Lines.IndexOf(i) = -1 then
Memo1.Lines.Add(i);
end;

end;
 
请问,如何从1到938随机选取 100 个不重复的随机数
var
r :Array[0..99] of integer

......

var
i,c :integer;

begin
Randomize;
For i:=0 to 99 do
begin
repeat
c:=Random(938);
until Random938(c,i);
r:=c;
end;
end;

Function Random938(c:Integer;j:Integer);
var
i :Integer;
begin
for i:=0 to j do
begin
if c=r then Result:=False else Result:=True;
end;
end;
 
多人接受答案了。
 
后退
顶部