效率很低,别笑我,我是二把刀; unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; myarray=array[0..29] of integer; var Form1: TForm1;implementation{$R *.dfm} function judgenotin(userint:integer;tmp:myarray):boolean; var i:integer; begin for i:=0 to 29 do begin if userint=tmp[i] then begin result:=false; exit; end; end; result:=true; end; function get30random:myarray; var tmp:myarray; i,userint:integer; begin // fillchar(tmp,30,0); for i:=0 to 29 do begin tmp[i]:=0; while true do begin randomize; userint:=random(101); if judgenotin(userint,tmp) then begin tmp[i]:=userint; break; end; end; end; result:=tmp; end; procedure TForm1.Button1Click(Sender: TObject); var dd:myarray; i:integer; begin dd:=get30random; listbox1.Clear ; for i:=0 to 29 do begin listbox1.Items.Add(inttostr(dd[i])); end; end;end.
是从0-99,不是29示例程序:var NumArr:array[0..99] of integer; GetNumArr:array[0..29] of integer; i:Integer; procedure GetNum; var i:integer; begin for i:=Low(NumArr) to High(NumArr) do NumArr[i]:=i+1; Randomize; for i:=Low(GetNumArr) to High(GetNumArr) do begin GetNumArr[i]:=NumArr[Random(High(NumArr)+1-i)]; if GetNumArr[i]<>NumArr[High(NumArr)] then begin NumArr[i]:=NumArr[High(NumArr)+1-i]; end; end; end;
用如下代码: ........ var i,n : integer; v : array[1..100] of boolean; t : integer; begin randomize; fillchar(t,sizeof(t),false); t := 0; for i := 1 to 30 do begin n := random(100); if [i]
哎呀,按错键了!正确的应该是: ........ var i,n : integer; v : array[1..100] of boolean; t : array[1..30] of integer;//存结果 begin randomize; fillchar(v,sizeof(v),false); fillchar(t,sizeof(t),0); for i := 1 to 30 do begin n := random(100); while v[n]=true do n := random(100); if v[n]=false then begin v[n] := true; t[i] := n; end; end; ..................
我不想再写了,随便写一个都和楼上的重复了..sigh... 来晚啦!
ehom大哥: 30个数中还有两个是重复的?
我现在想: 如果是对后台数据库里的若干记录进行随机取数,那应该是怎样呢? 即SQL的语句怎样写?
不好意思,昨天随手写的程序有错误!var NumArr:array[0..99] of integer; GetNumArr:array[0..29] of integer; i:Integer; procedure GetNum; var i,n:integer; begin for i:=Low(NumArr) to High(NumArr) do NumArr[i]:=i+1; Randomize; for i:=Low(GetNumArr) to High(GetNumArr) do begin n:=Random(High(NumArr)+1-i); GetNumArr[i]:=NumArr[n]; if GetNumArr[i]<>NumArr[High(NumArr)] then begin NumArr[n]:=NumArr[High(NumArr)+1-i]; end; end; end;//其实判断语句也可以去掉,加上只是为了更好理解
有个RandomFrom函数,配合ehom(?!) 兄的方法应该很方便 function RandomFrom(const AValues: array of Double): Double; overload; function RandomFrom(const AValues: array of Integer): Integer; overload; function RandomFrom(const AValues: array of Int64): Int64; overload; function RandomFrom(const AValues: array ofstring): string; overload;DescriptionRandomFrom returns a randomly selected element from the array passed as the AValues argument.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
myarray=array[0..29] of integer;
var
Form1: TForm1;implementation{$R *.dfm}
function judgenotin(userint:integer;tmp:myarray):boolean;
var
i:integer;
begin
for i:=0 to 29 do
begin
if userint=tmp[i] then
begin
result:=false;
exit;
end;
end;
result:=true;
end;
function get30random:myarray;
var
tmp:myarray;
i,userint:integer;
begin
// fillchar(tmp,30,0);
for i:=0 to 29 do
begin
tmp[i]:=0;
while true do
begin
randomize;
userint:=random(101);
if judgenotin(userint,tmp) then
begin
tmp[i]:=userint;
break;
end;
end; end;
result:=tmp;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
dd:myarray;
i:integer;
begin
dd:=get30random;
listbox1.Clear ;
for i:=0 to 29 do
begin
listbox1.Items.Add(inttostr(dd[i]));
end;
end;end.
NumArr:array[0..99] of integer;
GetNumArr:array[0..29] of integer;
i:Integer; procedure GetNum;
var
i:integer;
begin
for i:=Low(NumArr) to High(NumArr) do
NumArr[i]:=i+1;
Randomize;
for i:=Low(GetNumArr) to High(GetNumArr) do
begin
GetNumArr[i]:=NumArr[Random(High(NumArr)+1-i)];
if GetNumArr[i]<>NumArr[High(NumArr)] then
begin
NumArr[i]:=NumArr[High(NumArr)+1-i];
end;
end;
end;
........
var i,n : integer;
v : array[1..100] of boolean;
t : integer;
begin
randomize;
fillchar(t,sizeof(t),false);
t := 0;
for i := 1 to 30 do
begin
n := random(100);
if [i]
........
var i,n : integer;
v : array[1..100] of boolean;
t : array[1..30] of integer;//存结果
begin
randomize;
fillchar(v,sizeof(v),false);
fillchar(t,sizeof(t),0);
for i := 1 to 30 do
begin
n := random(100);
while v[n]=true do n := random(100);
if v[n]=false then begin v[n] := true; t[i] := n; end;
end;
..................
来晚啦!
30个数中还有两个是重复的?
如果是对后台数据库里的若干记录进行随机取数,那应该是怎样呢?
即SQL的语句怎样写?
NumArr:array[0..99] of integer;
GetNumArr:array[0..29] of integer;
i:Integer; procedure GetNum;
var
i,n:integer;
begin
for i:=Low(NumArr) to High(NumArr) do
NumArr[i]:=i+1;
Randomize;
for i:=Low(GetNumArr) to High(GetNumArr) do
begin
n:=Random(High(NumArr)+1-i);
GetNumArr[i]:=NumArr[n];
if GetNumArr[i]<>NumArr[High(NumArr)] then
begin
NumArr[n]:=NumArr[High(NumArr)+1-i];
end;
end;
end;//其实判断语句也可以去掉,加上只是为了更好理解
好象今天的程序和昨天的没啥区别呀!只是把
GetNumArr[i]:=NumArr[Random(High(NumArr)+1-i)];
换成了n:=Random(High(NumArr)+1-i);
GetNumArr[i]:=NumArr[n];
结果也是30个数中还有相同的数!
function RandomFrom(const AValues: array of Double): Double; overload;
function RandomFrom(const AValues: array of Integer): Integer; overload;
function RandomFrom(const AValues: array of Int64): Int64; overload;
function RandomFrom(const AValues: array ofstring): string; overload;DescriptionRandomFrom returns a randomly selected element from the array passed as the AValues argument.
你的意思是从数组中随机取一个数A,然后把取过的这个数A从数组中删掉
再从剩下的数中取下一个数B.对不对呀?