随机组合的问题 ( 积分: 100 )

W

Woooo

Unregistered / Unconfirmed
GUEST, unregistred user!
一列数据A,一列数据B,都有80个数据,
问:怎么把A中的数据随机和B中的数据搭配?
比如一个是1,2,3。。。
一个是a,b,c,他们互相随机搭配
 
一列数据A,一列数据B,都有80个数据,
问:怎么把A中的数据随机和B中的数据搭配?
比如一个是1,2,3。。。
一个是a,b,c,他们互相随机搭配
 
Randomize;
A[Random(80)]+B[Random(80)]
这样?
 
用Random() 同意楼上 可是A 和 B 应该是数组
而且你说的搭配是什么意思?
是简单的相加吗?
是不是从数组中随机选择一个数据啊?
如果是的话,楼上的方法应该可以的!
 
不是阿,这样会重复的,要分别对应
如果C对1,f也对1就不对,用Random就会重复的
 
我也不知道用数组表示好,还是用集合表示好
 
既随机 还不能重复 这个有点点麻烦
 
虽然笨点,但还是可以实现嘛,先说一句,我不是高手,所以解决的方法通常都是很笨的方法。
把80个数据分别都放在Sringgrid1 上的两个 Column

然后用刚才的随机函数取任意的数
var
i,j,k : integer;
begin
while k<80 do
begin
i := Random(80);
j := Random(80);
with Stringgrid1 do
begin
if Cells[0,i] <> '' and Cells[1,j] <>'' then
begin
你所需要的组合 := Cells[0,i] + Cells[1,j];
Cells[0,i] := '';//确保不重复
Cells[1,j] := '';
inc(k);//一共有80对组合
end
else
continue;
Next;
end;
end;
end

呵呵,不知道行不行,如果你要的不是这样的结果,再讨论。。。。
 
我有个思路

对数列A和数列B分别随机排序,排序方法如下:
(实际上是对每个数A随机与任意一个数交换位置)
for i:=1 to 80
begein
t:=random(80)+1;//产生一个1-80的随机数
temp:=A
//将第A从第i位交换到第t位
A:=A[t];
A[t]:=temp;
end
这样一轮下来.基本上所有数都交换了一遍,使数列A的数呈现随机排序状.
如果觉得随机度不足,可以重复几次上面的循环.

A,B都随机排序后, A搭配B (I=1 TO 80),这样保证搭配是随机的,而又保证不会重复
 
谢谢大家
以上2种方法我都试验了一下,mkim1980的方法稍微有点小缺陷,就是
i := Random(80);
j := Random(80);来找非空单元格的时候,在某些极限情况下:比如只剩下一个没配对了,用Random(80)的方法找,可能几百上千次都没找到。
富翁中的穷人的方法不错,而且简单。
再次谢谢大家
 
多人接受答案了。
 
你可以这样啊
原先是来年各个条件并列的
if Cells[0,i] <> '' and Cells[1,j] <>'' then
改成
if Cells[0,i] <>'' then
begin
if Cells[1,j] <>'' then
end
这样做的话效率会高一些。。
 
是啊,不改进的话,如果是只剩最后一个的话,
随机命中的概率只有是:1/80x1/80=0.015%
 
用我上面的方法,命中几率不就是1/80 了吗?
而且现在机器都这么快,1/80 的几率命中应该是感觉不到吧,
我没试过,但是应该不会影响运行速度。
 
顶部