请问谁知道关于随机数生成的问题?(10分)

  • 主题发起人 主题发起人 小唐
  • 开始时间 开始时间

小唐

Unregistered / Unconfirmed
GUEST, unregistred user!
我想编制一个能显示N(一个整数,如10,20,300等)以内的不重复的所有随机数的过程
。(例如N为5,那么我想得到5个随机显示的结果,如3,4,1,5,2或1,5,3,2,4等)
我原先想,首先建立一个含N个元素的数组,用随机函数random(n)取得第一个随机数,并
存入到数组的第一个元素中,再用随机函数取第二个随机数,这时将电脑给出的随机数与
数组中保存的那个随机数比较:如果重复,则让电脑继续取不同的随机数再与数组中已有
的元素值比较,直到不重复,这时将这个不重复的随机值存到数组的第二个元素中......
这样,一直到N为止。可是我实现起来总是进入到不能自拔的死循环或其它错误中,想请
各位朋友帮我实现这个目的,不甚感激!
 
贴出代码!
 
不,这样来:以5为例
先初始化字符串为 12345
随机从第一到5取出一个数字,比如3,把3和最后的5对调: 12543
最后一位固定下来,从第1到4各字符随机取出一个,比如第2个字符,和剩下的4个字符的
最后一个字符对调: 14523
剩下3个字符,继续……
 
to pipi:
我现在就试试你给出的思路。
 
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
str:string;
begin
memo1.Lines.Clear;
memo2.Lines.Clear;

for i:= 1 to 300 do
begin
memo1.Lines.Add(inttostr(i));
end;
Randomize;
while memo1.Lines.Count>0 do
begin
i:=Random(300);
if (i>=0) and (i<memo1.Lines.Count) then
begin
memo2.Lines.Add(memo1.Lines);
if memo2.Lines[memo2.Lines.Count-1]='300' then
showmessage('ok');
memo1.Lines.Delete(i);

end;
end;
showmessage(inttostr(memo2.Lines.Count));
end;
 
to hfghfghfg:
你好!
感谢你为我写出了一个示例代码!我在DELPHI5中试过了,可以通过,可是当我将你
代码中的这行:
if memo2.Lines[memo2.Lines.Count-1]='300' then
showmessage('ok');
删除后,程序就进入了无限(死循环)了,不知是何故?


 
我调试 用 的

你确定
只删了:
if memo2.Lines[memo2.Lines.Count-1]='300' then
showmessage('ok');
 
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
str:string;
begin
memo1.Lines.Clear;
memo2.Lines.Clear;

for i:= 1 to 300 do
begin
memo1.Lines.Add(inttostr(i));
end;
Randomize;
while memo1.Lines.Count>0 do
begin
i:=Random(300);
if (i>=0) and (i<memo1.Lines.Count) then
begin
memo2.Lines.Add(memo1.Lines);
// if memo2.Lines[memo2.Lines.Count-1]='300' then
// showmessage('ok');
memo1.Lines.Delete(i);

end;
end;
// showmessage(inttostr(memo2.Lines.Count));
end;
 
to hfghfghfg:
您好!非常感谢您的回答。
我又新建了一个项目重新将你的代码复制进去试了一次,这次通过了。可能正象你说
的,那次是我不小心删除了一些其它的语句吧。
虽然你的代码已经顺利通过了,可是好像没有通用性,我正在将你的代码进行改写,
等我改完了(大约十分钟吧)后再将我的代码贴上来,请您指正!
 
to hfghfghfg:
其实我问这个问题是出于这样的原因:我看到一些背单词软件能够按随机顺序将一
定的单词(如30或50个单词等)逐个不重复(前面这五个字很重要!)地调到屏幕上,
所以我也想实现这种功能,可是自己搞了好久也没有搞成功,今天在你的帮助下终于
解决了这个我认为是难题的问题!非常高兴!
我将您的代码中的memo元件改为用TStringList来代替,这一下子就弄完了,我又
增加了一些功能,调试程序花了我整整一个小时!
在此将我的代码贴出来,与大家共享,希望朋友们看过后能够解决相似问题:
(首先要在form上增加Button1和Button2两个按钮),再增加一个label1即可:
unit Unit1;

interface

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

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

var
Form1: TForm1;
j : integer
//循环控制变量
sl1,sl2 : TStringList;

implementation

{$R *.DFM}

procedure TForm1.Button2Click(Sender: TObject);
const
Range=5
//这个值表示要生成随机数的最大值不超过5
var
i : integer;
jg : integer
//最终结果
begin
if j=Range then
begin
// j :=0
//将此句移入了Button1里面了!
showMessage(intToStr(Range)+'以内所有不重复的随机数都已经显示完毕!'+#13+'如要再来请按Button1钮后再执行我。');
exit;
end;
if sl2.Count=0 then
begin
for i :=1 to Range do
sl1.Add(intToStr(i));
Randomize;
while sl1.Count >0 do
begin
i :=Random(Range);
if (i>=0) and (i<sl1.Count) then
begin
sl2.Add(sl1.strings);
sl1.Delete(i);
end;
end;
//这一句很重要的
Button2.click;
end
else
begin
jg :=StrToInt(sl2.strings[j]);
label1.Caption :=label1.Caption +intToStr(jg)+' ';
showMessage('第'+intToStr(j+1)+'次显示'+intToStr(Range)+'以内的随机数!'+#13#13+'随机数的值是:'+intToStr(jg)+#13#13+'请检查这个值是否会和下次看到的重复!');
j :=j+1;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
sl1 :=TStringlist.Create
sl2 :=TStringlist.Create
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
//使得在运行完一遍(即点击Button2钮Range次后
//再点击Button2钮,能得到新的随机结果!
sl1.Free;
sl2.Free;
sl1 :=TStringList.Create
sl2 :=TStringList.Create
j :=0;
end;

end.
 
上次忘了给分了,抱歉。
 
后退
顶部