随机取数?(20分)

  • 主题发起人 主题发起人 天什
  • 开始时间 开始时间

天什

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么样才能随机的取数?
比如在0-50之间,
每次才能取一个,取51次,并且需要不存在有相同的数.
有什么好算法吗?
 
var
NumberCount : array[0..50] of integer;
Numbers : array[0..50] of integer;

Procedure TForm1.SelectNumber;
var
inum,iValue,j,k : integer;
str,strsub:string;
begin
for k := 0 to 50do
begin
NumberCount[k] := 0;
end;
for j := 1 to 50do
begin
for inum := 0 to 50do
begin
repeat
iValue := Random(50) + 1;
until NotExistNum(iValue);
Numbers[inum] := iValue;
end;
end;
end;
Function TForm1.NotExistNum(inumv:integer):boolean;
var
i :integer;
begin
Result := True;
for i := 0 to 50do
begin
if Numbers = inumv then
Result:=false;
end;
end;

不知道符不符合你的要求
 
随机函数所产生的随机数也是固定的。
怎样才能让它更随机一些
 
在程序开始先调用随机数初始化过程Randomize
 
计算机不可能产生真正的随机数,能够产生的都是伪随机数,只是说周期比较长的伪随机
序列,看起来随机性好一些罢了
 
看一看我的回答:LID=542886
绝对经点而有效的算法。
 

定义一个长度为1的大小可变数组
rndomize '这是为了产生随机种子
A=int(rnd()*51) '这是为了0-50都能够取得到
然后开始for循环
--比较A与数组的每一个数,如果不存在相同的数,则将数组的大小加一,并将A存在数组的最后一位。
‘这页是个for循环,还有条件语句。
--存在相同的数,则再重新取随机数。
--如此往复,即可,这只是个想法,不过肯能会比较费资源,理论上有可能实现的,实际中很难。
--为什么非要取随机顺序,可以将一个有0-50的数组中的数值随机付给另一个数组,所得数组不就是50个不相同的数值了。
 
非要再贴一遍吗?
var
Temp:integer;
i,j:integer;
M:array[0..50]of Integer;
begin
randomize;
for i:=0 to 50do
M:=i;
for i:=0 to 50do
begin
//此算法将被选中的数放到数组头部,然后再剩下的数中进行选取
j:=random(51-i)+i;
//每循环一次范围减1
Temp:=M;
//交换M和M[j]
M:=M[j];
M[j]:=Temp;
end;
//此时M[]中已经是0-50的不重复随机数了
end;
 
我的方法和creation-zy相似
我是用一个动态数组保存0~50的数
随机取数组的下标,每取到一个下标
则将该下标的元素取出,并删除该元素
数组长度减1 ,然后抽下一个数的时候
再随机取0~49的下标,类推。。。
 
多人接受答案了。
 
后退
顶部