生成三个全部不同数字的最有效方法

时间:2012-05-25 11:50:39

标签: arrays random comparison

我需要从1-9生成三个随机数,每个数字不能与其他任何数字匹配。我现在这样做,下面的脚本工作正常但是想知道是否还有其他更有效的方法可以做到这一点?

$rndn1 = 0;
$rndn2 = 0;
$rndn3 = 0;
while ($rndn1 == $rndn2 || $rndn2 == $rndn3 || $rndn1 == $rndn3) {
  $rndn1 = rand(1,9);
  $rndn2 = rand(1,9);
  $rndn3 = rand(1,9);
}

另外,如果需要4个或更多数字来完成相同的过程,使用上面的简单表达式会变得复杂。

由于

2 个答案:

答案 0 :(得分:2)

从1-9创建数字的随机排列,然后选择前3个数字,或者如果需要4 ...等等......

http://en.wikipedia.org/wiki/Random_permutation#Knuth_shuffles

尝试使用此alg。创造排列。

此解决方案可根据您需要选择的数字范围和数量进行扩展。只要数字范围(例如1-9)是唯一的,此解决方案就不会重复您选择的3个数字。

答案 1 :(得分:0)

您不需要每次都生成三个数字。

这是第一步:

$rndn2 = 0;
$rndn3 = 0;
$rndn1 = rand(1,9);
while ($rndn1 == $rndn2 || $rndn2 == $rndn3 || $rndn1 == $rndn3) {
  $rndn2 = rand(1,9);
  $rndn3 = rand(1,9);
}

显然你可以做得更远:

$rndn1 = rand(1,9);
$rndn2 = rand(1,9);
while ($rndn1 == $rndn2) {
 $rndn2 = rand(1,9);
}
$rndn3 = rand(1,9);
while ($rndn2 == $rndn3 || $rndn1 == $rndn3) {
  $rndn3 = rand(1,9);
}

如果没有分析,请不要尝试优化太多。通常不需要这样做。并且唯一可能成本高昂的操作是rand:这是你必须最小化的那个(所以如果你只是在寻找3个数字,那么在你测试之前不要产生更多数字(问题会因为更多而有所不同))