还是随机数数组问题,欢迎大家指点。 ( 积分: 50 )

  • 主题发起人 主题发起人 lwcsoft
  • 开始时间 开始时间
L

lwcsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
要在100个数中随机抽出其中50个数放到一个数组中,要求不是顺序的,没有重复的,有没有好的解决方法,请大家赐教。
 
要在100个数中随机抽出其中50个数放到一个数组中,要求不是顺序的,没有重复的,有没有好的解决方法,请大家赐教。
 
首先用Random(99)产生一个0~100间的随机数,然后用此随机数作为由100个数组成的数组中取数的下标并记录本次产生随机数到一个已使用下标数组中(避免重复)。然后再次产生一个随机数后检查新的随机数是否在下标记录数组中,若不在则从100个数中以本次产生随机数为下标取数并记录,否则重新产生随机数。重复以上过程直至取到50个数。
 
procedure RandomData(AMax, ACount: Integer;
RList: TStrings);
var
FAllDatas, FDatas: array of Integer;
i, k: Integer;
procedure InitAllDatas();
var
j: Integer;
begin
//这里用从 0 到 AMax - 1 来初始化待采样的数组
//也可以用其它的数据初始化这个数组,只要重新改写这个函数就是了
for j := 0 to AMax - 1do
FAllDatas[j] := j;
end;
begin
Randomize;
SetLength(FAllDatas, AMax);
InitAllDatas();//初始化采样数组
SetLength(FDatas, ACount);
for i := 0 to ACount - 1do
begin
k := Random(AMax - i);
FDatas := FAllDatas[k];
if k <> AMax - i then
FAllDatas[k] := FAllDatas[AMax - i];
end;

//输出,这里采用TStrings来记录输出数组,主要是为了使用方便
RList.Clear;
for i := 0 to ACount - 1do
RList.Add(IntToStr(FDatas))
end;

AMax 是最大数(按照你的要求,AMax =100)
ACount 是个数(按照你的要求,ACount =50)
RList就是你想要的
要生成你要的数组,只需要RandomData(100, 50, RList)
 
和你上个问题一样解决啊,你只要在保存到50个数的时候就跳出循环就可以了啊,还有上次我的怎么会没结果呢,我用的好好的啊,奇怪
 
说的也是啊,可能是我的问题吧,你能把你的代码贴出来吗
 
VAR
i,j:Integer;
AA:Array[1..50] of Integer;
BB:Array[1..100] of Integer;
begin
i:=1;
while i<51do
//给两个数组符个初值
begin
AA:=0;
Inc(i);
end;

i:=1;
while i<101do

begin
BB:=0;
Inc(i);
end;

i:=1;
while i<51do
begin
j:=random(100)+1;
//随即出现1-100
if (BB[j]=0 ) then
//判断j有没有出现过,BB[j]=0表示j没出现过了
begin
BB[j]:=1;
AA:=j;
Inc(i);
end;

end;
end;
AA中的结果就是你要的
 
上次叫你看我回答过的旧帖不知你看了没有,如果我那段代码你看懂了这个问题就很容易解决。
 
同样的问题,我也写上同样的回复吧。。
Const
MaxNum = 100;
CutNum = 50;
procedure TForm1.Button1Click(Sender: TObject);
var
i, Last: integer;
a: array [1..MaxNum] of integer;
b: array [1..CutNum] of integer;
begin
Randomize;
for i := 1 to MaxNumdo
a := i;
for Last := MaxNumdo
wnto MaxNum - CutNum + 1do
begin
//同样的算法,我就不说了。
i := random(Last) + 1;
b[MaxNum - Last + 1] := a;
a := a[Last];
end;
Memo1.Text := 'Out Array:';
//输出
Memo1.Lines.begin
Update;
for i := 1 to CutNumdo
Memo1.Lines.Add(Inttostr(b));
Memo1.Lines.EndUpdate;
end;
 
for i:=1 to 50do
begin
repeat c:=Random(100) until pos(inttostr(c),str)=0;
str:=str+inttostr(c);
end;
for i:=0 to 50do
p:=strtoint(str);
 
用IF句当出现同样数字时重新进行循环
 
同意jeffrey_s方法
 
现在也不知道怎么的了,一天天的脑子也不想问题,就是想了也想不出结果,现在考虑到的是否还要编程,现在编程已经没有以前那种尽头,现在就是为了编编玩玩,不知以后是否还要继续,迷茫!是不是人大就没有了那种年青的劲头,虽然我还不大,但感觉老了。[:(]
 
多人接受答案了。
 
后退
顶部