以下代码,产生一个集合,包含7个1到30之间的随机数
var
R: set of 1..30;
I, K: Integer;
begin
Randomize;
R := [];
I := 0;
while I < 7 do
begin
K := Random(30) + 1; // Random(30) 是产生0..29的随机数
if not (K in R) then
begin
R := R + [K];
Inc(I)
end;
end;
end;
1,大家的思路都是顺序法,然后在所有已选数据中进行排除.
2,上面的XWHope兄说的对,我看应该用 Random(30)+1 就对了
我的思路是既然不允许重复,肯定需要提取列表)
1-30中任何7个数的和最大不会超过30+29+28....24
最小不会小于1+2+3+4+5+6+7
那么如下
var
i,x : integer;
iarr : array [0..6] of integer;
arrsum : integer;
begin
for i :=28 to 27*7 do
begin
while (arrsum<>i) do
begin
listbox1.items.add("此处打印取出来的数组");
arrsum :=0;
for x := 0 to 6 do
begin
iarr[x] := Random(30)+1;
arrsum := arrsum +iarr[x];
if (x<6) and (arrsum>=i) then break;
end;
if (x<6) then arrsum := 0;
end;
end;
var
i: set of 1..30;
j: array [1..7] of Integer;
k, l: Integer;
m: string;
begin
Randomize;
k := 1;
m := '';
while k <= 7 do begin
l := Random(30) + 1;
if l in i then begin
i := i - [l];
j[k] := l;
m := m + IntToStr(j[k]) + ' ';
Inc(k);
end;
end;
Edit1.Text := m;
end;
如果只是取一组,那么应该这样写:
var
i, n : integer;
Data: array [0..29] of integer;
Datacount: integer;
s: string;
begin
s := '';
for i := 0 to 29 do
Data := i;
Datacount := 30
Randomize; { 随机数初始化 }
for i := 1 to 7 do
begin
n := random(Datacount);
{ 在这里处理数据 }
s := s+inttostr(Data[n])+' ';
{ 处理完毕 }
Data[n] := Data[Datacount-1];
Datdcount := Datacount-1;
end;
end;
思路如下:
先分配一个数组,将1-30放入。
随机取一个进行处理。
将最后一个数放入刚才取的位置,数组大小减一。
这样数组里就是除了取掉的数外剩下的数了。
重复上述步骤直到取够7个数。