关于取不重复的随机数问题
我想从个数中随机取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,那也跳不出循环
[解决办法]
[解决办法]
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;