要怎样写代码才能使这四个数不重复呢?(20分)

  • 主题发起人 主题发起人 sy0116
  • 开始时间 开始时间
S

sy0116

Unregistered / Unconfirmed
GUEST, unregistred user!
偶用以下代码来随机取4个数,但发现这四个数有时会有重复,要怎样写代码才能使这四个数不重复呢?
a:=inttostr(0 + Random(9 - 0));
b:=inttostr(0 + Random(9 - 0));
c:=inttostr(0 + Random(9 - 0));
d:=inttostr(0 + Random(9 - 0))
 
还有,为什么这样算出来的几个数每次都是一样的,即第一次运行程序时a=0,第二次运行程序时a也=0,第三、四次也都一样,其它的b,c,d也是
 
需要初始化随机种子
randmize

可以将生成的第一个数放到一个stringlist中
第二个生成的用indexof去找如果为-1说明不重复有效,将第二个数也加到stringlist中
以此类推
 
首先你需要在程序中使用Randomize进行一次初始化,由于Random生成的是伪随即数,所以在不改变参数时每次第一次运行时得到的是相同的数,你可以先编写一个循环让Random运行几次,然后得到的就是比较理想的随即数了。
 
关于重复的问题我还不太明白
 
先做个循环让Random运行几次,以后的就是比较好的随机数了,如:
for iLoop := 0 to 9 do
Random(9);
然后使用Random取随机数。
 
这样还是会重复阿
 
加个条件了,如果B算出的数跟A相同,就重新取数了,以此类推!
 
var I1,I2,I3,I4:integer;4个数字.
Randomize;
I1:=random(10);
repeat I2:=random(10);
until I1<>I2;
repeat I3:=random(10);
until (I3<>I1) and (I3<>I2);
repeat I4:=random(10);
until (I4<>I1) and (I4<>I2) and (I4<>I3);
随机产生4个0-9之间不重复的数字.
 
可以建立一个数组 你把0-9的数字放进去,然后第一个用 random(10),把获得的数字从数组中去调,在用random(9) 取第二个.

好处: 一 不会重复
二 随机四次可以保证得到你要的数据

代码你可以自己写,如果需要帮忙在联系了!
 
更换一下种子
建议使用日期做种子
 
简单的一个程序,供参考

var
s,stmp:string;
I1,I2,I3,I4:integer;
begin
S:='0123456789';
Randomize;
I1:=ord(s[random(10)+1])-ord('0');
stmp:=copy(s,1,I1);
s:=stmp+copy(s,I1+2,10);

I2:=ord(s[random(9)+1])-ord('0');
stmp:=copy(s,1,I2);
s:=stmp+copy(s,I2+2,9);

I3:=ord(s[random(8)+1])-ord('0');
stmp:=copy(s,1,I3);
s:=stmp+copy(s,I3+2,8);

I4:=ord(s[random(7)+1])-ord('0');
stmp:=copy(s,1,I4);
s:=stmp+copy(s,I4+2,7);
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
sl: TStringList;
i, j: integer;
begin
Memo1.Lines.Clear;

sl := TStringList.Create;
for i := 0 to 255 do
sl.Add(inttostr(i));

for i := 1 to 4 do
begin
j := Random(sl.Count);
memo1.Lines.add(sl[j]);
sl.Delete(j);
end;

freeandnil(sl);

end;

procedure TForm1.Button2Click(Sender: TObject);
var
st: set of byte;
function addOne: byte;
begin
result := 0;
repeat
result := Random(256);
until
not (result in st);
st := st + [result];
end;
begin
st := [];
Memo1.Lines.Clear;

Memo1.Lines.Add(inttostr(addOne));
Memo1.Lines.Add(inttostr(addOne));
Memo1.Lines.Add(inttostr(addOne));
Memo1.Lines.Add(inttostr(addOne));

end;

initialization
Randomize;
end.

 
方法 1:
var

sl: TStringList;
i, j: integer;
begin
Memo1.Lines.Clear;

sl := TStringList.Create;
for i := 0 to 255 do
sl.Add(inttostr(i));

for i := 1 to 4 do
begin
j := Random(sl.Count);
memo1.Lines.add(sl[j]);
sl.Delete(j);
end;

freeandnil(sl);
 
方法2:
var
st: set of byte;
function addOne: byte;
begin
result := 0;
repeat
result := Random(256);
until
not (result in st);
st := st + [result];
end;
begin
st := [];
Memo1.Lines.Clear;

Memo1.Lines.Add(inttostr(addOne));
Memo1.Lines.Add(inttostr(addOne));
Memo1.Lines.Add(inttostr(addOne));
Memo1.Lines.Add(inttostr(addOne));

 
接受答案了.
 

Similar threads

回复
0
查看
867
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
后退
顶部