老师有一项作业内容如下
求10-100的随机数,比如min为10,max100.第一次随机出来是13,然后在随机的时候就是从10,11,12,14,15..100第2次随机出来是15 然后就是从10.11.12.14.16.17....100以此类推 显示一共循环多少次 如入说 我点了按钮10次 出现100 多少次,99多少次,98多少次.. 还有就是 我随机完了按要求 比如随机的数字是 10 15 20 我填进去了 下次随机的时候就自动抛出在外 没有他们3了 ...谢谢各位大侠帮忙了 最好给出完整的代码
求10-100的随机数,比如min为10,max100.第一次随机出来是13,然后在随机的时候就是从10,11,12,14,15..100第2次随机出来是15 然后就是从10.11.12.14.16.17....100以此类推 显示一共循环多少次 如入说 我点了按钮10次 出现100 多少次,99多少次,98多少次.. 还有就是 我随机完了按要求 比如随机的数字是 10 15 20 我填进去了 下次随机的时候就自动抛出在外 没有他们3了 ...谢谢各位大侠帮忙了 最好给出完整的代码
产生不重复随机数的算法能够解决诸如随机洗牌,抽彩等问题,在网上的一些算法自觉较繁,现给出简单的算法。以下源程序为1..36个数字,随机排列,产生不重复随机数。
varaa : 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
aa[i]:=inttostr(i);
end;{随机进行排列}procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
swapa:string[2];
begin
randomize;
for i:=1 to 36 do
begin
j:=i+random(36);
swapa:=aa[i];
aa[i]:=aa[j];
aa[j]:=swapa;
end; //由此得到不重复的随机排列数字
end;
是特简单,可为什么特简单你不会呢。自己写写吧,没用到几个东西.
SysUtils, Classes;type
TGenRandom = class
private
FNumbers: TList;
function GetNumber(Index: Integer): Integer;
procedure SetNumber(Index: Integer; const Value: Integer);
function GetCount: Integer;
public
constructor Create;
destructor Destroy; override;
procedure AddNumber(Number: Integer);
procedure RemoveAll; function RemoveAt(Index: Integer): Integer;
function Next(): Integer; //在Numbers里随机选一个数
property Number[Index: Integer]: Integer read GetNumber write SetNumber;
property Count: Integer read GetCount;
end;implementation{ TGenRandom }constructor TGenRandom.Create;
begin
Randomize;
FNumbers := TList.Create;
end;destructor TGenRandom.Destroy;
begin
RemoveAll;
FNumbers.Free;
inherited;
end;procedure TGenRandom.AddNumber(Number: Integer);
//加一个参与随机挑选的数
var
PNum: PInteger;
begin
New(PNum);
PNum^ := Number;
FNumbers.Add(PNum);
end;procedure TGenRandom.RemoveAll;
var
i: Integer;
begin
for i := FNumbers.Count - 1 downto 0 do
RemoveAt(i);
end;function TGenRandom.RemoveAt(Index: Integer): Integer;
//移去第Index项,并返回第Index项的数字
var
P: PInteger;
begin
P := FNumbers.Items[Index];
Result := P^;
Dispose(P);
FNumbers.Delete(Index);
end;function TGenRandom.GetNumber(Index: Integer): Integer;
begin
Result := PInteger(FNumbers.Items[Index])^;
end;procedure TGenRandom.SetNumber(Index: Integer; const Value: Integer);
begin
PInteger(FNumbers.Items[Index])^ := Value;
end;function TGenRandom.GetCount: Integer;
begin
Result := FNumbers.Count;
end;function TGenRandom.Next: Integer;
//随机选一个数,并把它移出,防止下次选择时重复出现
//选择的范围为FNumbers里所有的数
begin
Result := RemoveAt(Random(Count));
end;end.
调用代码uses GenRandom;procedure TForm1.Button1Click(Sender: TObject);
var
GenRandom: TGenRandom;
i: Integer;
S: string;
begin
GenRandom := TGenRandom.Create;
try
for i := 10 to 100 do
GenRandom.AddNumber(i); S := '';
while GenRandom.Count > 0 do
begin
if S = '' then
S := IntToStr(GenRandom.Next())
else
S := S + ', ' + IntToStr(GenRandom.Next());
end;
ShowMessage(S);
finally
GenRandom.Free;
end;
end;
打开Delphi,建一个按扭,双击它,写入下面代码:
procedure TForm1.Button1Click(Sender: TObject);
var
GenRandom: TGenRandom;
i: Integer;
S: string;
begin
GenRandom := TGenRandom.Create;
try
for i := 10 to 100 do
GenRandom.AddNumber(i); S := '';
while GenRandom.Count > 0 do
begin
if S = '' then
S := IntToStr(GenRandom.Next())
else
S := S + ', ' + IntToStr(GenRandom.Next());
end;
ShowMessage(S);
finally
GenRandom.Free;
end;
end;
然后,在USES里面添加一个GenRandom,接着,点全部保存。保存到C:\ABC目录中。最后,把下面的代码复制到记事本,保存是输入保存名为C:\ABC\GenRandom.PAS(必须这样写),然后把用Delphi编译你的程序吧,得到的数就是从10到100间不重复的随机数:unit GenRandom;interfaceuses
SysUtils, Classes;type
TGenRandom = class
private
FNumbers: TList;
function GetNumber(Index: Integer): Integer;
procedure SetNumber(Index: Integer; const Value: Integer);
function GetCount: Integer;
public
constructor Create;
destructor Destroy; override;
procedure AddNumber(Number: Integer);
procedure RemoveAll; function RemoveAt(Index: Integer): Integer;
function Next(): Integer; //在Numbers里随机选一个数
property Number[Index: Integer]: Integer read GetNumber write SetNumber;
property Count: Integer read GetCount;
end;implementation{ TGenRandom }constructor TGenRandom.Create;
begin
Randomize;
FNumbers := TList.Create;
end;destructor TGenRandom.Destroy;
begin
RemoveAll;
FNumbers.Free;
inherited;
end;procedure TGenRandom.AddNumber(Number: Integer);
//加一个参与随机挑选的数
var
PNum: PInteger;
begin
New(PNum);
PNum^ := Number;
FNumbers.Add(PNum);
end;procedure TGenRandom.RemoveAll;
var
i: Integer;
begin
for i := FNumbers.Count - 1 downto 0 do
RemoveAt(i);
end;function TGenRandom.RemoveAt(Index: Integer): Integer;
//移去第Index项,并返回第Index项的数字
var
P: PInteger;
begin
P := FNumbers.Items[Index];
Result := P^;
Dispose(P);
FNumbers.Delete(Index);
end;function TGenRandom.GetNumber(Index: Integer): Integer;
begin
Result := PInteger(FNumbers.Items[Index])^;
end;procedure TGenRandom.SetNumber(Index: Integer; const Value: Integer);
begin
PInteger(FNumbers.Items[Index])^ := Value;
end;function TGenRandom.GetCount: Integer;
begin
Result := FNumbers.Count;
end;function TGenRandom.Next: Integer;
//随机选一个数,并把它移出,防止下次选择时重复出现
//选择的范围为FNumbers里所有的数
begin
Result := RemoveAt(Random(Count));
end;end.
var
i:integer;
tmp:string;
s:TStringList;
begin
Randomize;
s:=TStringList.Create;
while (s.Count<90) do
begin
tmp:=inttostr(11+Random(90));
if s.IndexOf(tmp)=-1 then s.Add(tmp);
end;
showmessage(s.CommaText);
s.Free;
end;
修正一点:tmp:=inttostr(11+Random(90)); //这个是取11到100之间的数。改为:tmp:=inttostr(10+Random(91)); //这个才合你的要求。
不过 j:=i+random(36); 会越界吧?
应该改成
j:=(i+random(36)) mod 36 + 1;