读书人

关于取不重复的随机数有关问题

发布时间: 2012-03-03 15:33:02 作者: rapoo

关于取不重复的随机数问题
我想从个数中随机取n个数,而且这n个数要不重复的。代码如下:

Delphi(Pascal) code
procedure TForm1.ChoosenumClick(Sender: TObject);var  m,n: integer;  i,k: integer;  t: array [1..30] of boolean;begin        for k:=1 to 30 do      t[k]:=False;    n:=strtoint(Edit_num.Text);    if Label3.Caption<>'' then       Label3.Caption:='';    for i:=1 to n do     begin          m:=Random(strtoint(Edit_fanwei.Text));          if t[m]=True then            //   i:=i-1           else            //n:=n+1;            begin              Label3.Caption:=Label3.Caption+'        '+inttostr(m);              t[m]:=True;            end;      end;    { repeat          m:=Random(strtoint(Edit_fanwei.Text));          if t[m]=True then               i:=i-1          else            begin              Label3.Caption:=Label3.Caption+'        '+inttostr(m);              t[m]:=True;              i:=i+1;            end;     until(i>=n);   }end;

用for循环就是当有重复时会浪费一次计算,从而随机数达不到n个
用repeat就是不知为什么老弹出内存错误
请问是什么问题?

[解决办法]
function Random [ ( Range: Integer) ];

Description

In Delphi code, Random returns a random number within the range 0 <= X < Range.

注意 随机数可能出现0,所以boolean数组要开到0
还有,在程序开始时对i赋初值0
还有 i:=i-1 这句是不用的,不然产生的数字个数会多出来

[解决办法]
repeat
m:=Random(strtoint(Edit_fanwei.Text));
if t[m]=True then
//i:=i-1
else
begin
Label3.Caption:=Label3.Caption+' '+inttostr(m);
t[m]:=True;
i:=i+1;
end;
until(i>=n);

但是感觉这样还是不对。当m>k时,数组就溢出了,再就是m<n时(即输入的Edit_fanwei.Text<Edit_num.Text)时,i最大就只能是m,那也跳不出循环
[解决办法]
探讨
但是感觉这样还是不对。当m>k时,数组就溢出了,再就是m<n时(即输入的Edit_fanwei.Text<Edit_num.Text)时,i最大就只能是m,那也跳不出循环

[解决办法]
procedure TForm1.Button1Click(Sender: TObject);
var
i,j: integer;
vstrList: TStringList;
begin
Memo1.Lines.Clear;
vstrList := TStringList.Create;
try
i := 0;
while i<>StrToInt(Edit1.Text) do //当取出N个数时就跳出循环
begin
Randomize;
j := Random(StrToInt(Edit2.Text));
while true do
begin
if vstrlist.IndexOf(inttostr(j))=-1 then //如果不重复就跳出
begin
vstrList.Add(inttostr(j));
i := i+ 1;
break;
end;
end;
end;
memo1.Lines.Add(vStrList.Text);
finally
vstrlist.Free;
end;
end;

[解决办法]
落了条语句
Delphi(Pascal) code
procedure TForm1.Button1Click(Sender: TObject);var  i,j: integer;  vstrList: TStringList;begin  Memo1.Lines.Clear;  vstrList := TStringList.Create;  try    i := 0;    while  i<>StrToInt(Edit1.Text) do   //当取出N个数时就跳出循环    begin      Randomize;      j := Random(StrToInt(Edit2.Text));      while true do      begin        if vstrlist.IndexOf(inttostr(j))=-1 then   //如果不重复就跳出        begin          vstrList.Add(inttostr(j));          i := i+ 1;          break;        end;        j := Random(StrToInt(Edit2.Text));      end;    end;    memo1.Lines.Add(vStrList.Text);  finally    vstrlist.Free;  end;end; 

读书人网 >.NET

热点推荐