level 1
请问用如何用这个2-D array 来产生不重覆的随机数??
数字范围可以0-5 或者0-9,简单就好,
output e.g.
5 2 3 OR 5 7 9
1 4 0 2 4 0
1 3 6
求各种大神来帮忙一下!!!!!!
2015年07月19日 06点07分
1
level 1
program abc;
var k,r,j : integer;b:boolean;
a: array[1..9] of integer;
begin
randomize;
k:=1;
while K<=9 do
begin
r:=random(9);a[k]:=r;
b:=true;
for j := 1 to k- 1 do
if r=a[j] then b := false;
if b then k:=k+1;
end;
for k := 1 to 9 do
writeln(a[k]);
readln;
end.
可以用这个来改写一下吗?
2015年07月19日 06点07分
4
level 14
不太明白意思。。
如果只是随机不重复,可以先按下标赋值,再随机交换。简单代码参见如下:
randomize;
for i:=1 to n do a[i]:=i;
for i:=1 to n do swap(a[random(n)+1],a[random(n)+1]);
这个是对pai的常用方法啊,不能不知道。。这都不会的话更复杂的建树就别提了。。
如果说是改你那段代码。。我看不太懂,难道你们老师让你们用链表随机?
这种方法也可以,写起来稍麻烦点,就是每次输出并删掉一个数。简单代码参见如下:
for i:=0 to n-2 do a[i]:=a[i+1];
a[n-1]:=0;
for i:=0 to n-1 do b[i]:=true;
i:=n-1;
while i>0 do
begin
j:=random(n)
while b[j]=false do j:=a[j];
write(j,' ');
b[j]:=false;
a[(j+n-1)mod n]:=a[j];
i:=i-1
end;
其实删掉是为了避免查找时找不到,而不删掉只标记也是可以的。因为随机数平均n次中至少能找到1次,所以即使只标记随机也很快的,简单代码参见如下:
for i:=0 to n-1 do b[i]:=true;
i:=n;
while i>0 do
begin
j:=random(n);
if b[j] then
begin
write(j,' ');
b[j]:=false;
i:=i-1
end
end;
2015年07月19日 08点07分
5
代码比较难看啊。。没办法百度吃空格哎
2015年07月19日 08点07分