procedure TForm1.Button1Click(Sender: TObject); var a:array[1..14]of integer;//14个数 b:array[1..10]of integer;//结果 c:array[1..14]of boolean;//标志,默认false i,temp:integer; begin for i:=1 to 14 DO begin a[i]:=i; c[i]:=false; end; for i:=1 to 10 do begin temp:=Random(14)+1; while c[temp]=true do begin temp:=Random(14)+1; end; b[i]:=temp; c[temp]:=true; end; ListBox1.Clear; for i:=1 to 10 do ListBox1.Items.Add(IntToStr(b[i])); end;
这是一个类似洗牌的问题 我修改一下楼上的代码procedure TForm1.Button1Click(Sender: TObject); var b:array[1..14]of integer;//14个数 i,temp:integer; begin for i:=1 to 14 DO b[i]:=i; ListBox1.Clear; for i:=1 to 10 do begin temp:=Random(14-i+1)+1; ListBox1.Items.Add(IntToStr(b[temp])); b[temp]:=b[14-i+1]; end; end;
我的错了一点,改一下 procedure TForm1.Button1Click(Sender: TObject); var a:array[1..14]of integer;//14个数 b:array[1..10]of integer;//结果 c:array[1..14]of boolean;//标志,默认false i,temp:integer; begin for i:=1 to 14 DO begin a[i]:=i; c[i]:=false; end; for i:=1 to 10 do begin temp:=Random(14)+1; while c[temp]=true do begin temp:=Random(14)+1; end; b[i]:=a[temp]; c[temp]:=true; end; ListBox1.Clear; for i:=1 to 10 do ListBox1.Items.Add(IntToStr(b[i])); end;
var a:array[1..14]of integer;//14个数
b:array[1..10]of integer;//结果
c:array[1..14]of boolean;//标志,默认false
i,temp:integer;
begin
for i:=1 to 14 DO
begin
a[i]:=i;
c[i]:=false;
end;
for i:=1 to 10 do
begin
temp:=Random(14)+1;
while c[temp]=true do
begin
temp:=Random(14)+1;
end;
b[i]:=temp;
c[temp]:=true;
end;
ListBox1.Clear;
for i:=1 to 10 do
ListBox1.Items.Add(IntToStr(b[i]));
end;
我修改一下楼上的代码procedure TForm1.Button1Click(Sender: TObject);
var
b:array[1..14]of integer;//14个数
i,temp:integer;
begin
for i:=1 to 14 DO
b[i]:=i;
ListBox1.Clear;
for i:=1 to 10 do
begin
temp:=Random(14-i+1)+1;
ListBox1.Items.Add(IntToStr(b[temp]));
b[temp]:=b[14-i+1];
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a:array[1..14]of integer;//14个数
b:array[1..10]of integer;//结果
c:array[1..14]of boolean;//标志,默认false
i,temp:integer;
begin
for i:=1 to 14 DO
begin
a[i]:=i;
c[i]:=false;
end;
for i:=1 to 10 do
begin
temp:=Random(14)+1;
while c[temp]=true do
begin
temp:=Random(14)+1;
end;
b[i]:=a[temp];
c[temp]:=true;
end;
ListBox1.Clear;
for i:=1 to 10 do
ListBox1.Items.Add(IntToStr(b[i]));
end;
数组 b 记录 1~14第一次从 b[1] ~ b[14]中任意选择一个数,作为第一个数;
剔除此数,把最末一个数b[14]添到这个位置;第二次从b[1] ~ b[13]中任意选择一个数,作为第二个数;
剔除此数,把最末一个数b[13]添到这个位置;.....第十次从b[1] ~ b[4]中任意选择一个数,作为第十个数;
剔除此数,把最末一个数b[10]添到这个位置;这样写时间复杂度最低。
就是随机生成2个数m,n,然后交换
b[m]<==> b[n];当这个操作进行了足够次数的时候,
我们取从b[1]到b[10] 他一定是随机数序列,这个办法的效率比较低,你了解就行了,他的效果和上面的代码是相同的。
那么可用这个算法
因为只是从14个数中随机
可以声明一个boolean数组长度14,分别代表14个数,随机到相应的数相应的位置true
随机函数执行完14次后,把数组的内容加起来若小于10则表明随机过程中有重复,继续随机。另外,14个数中取10个不如14个中取4个然后从中去除这4个数菜鸟回帖不要笑