0

我需要从 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 个或更多数字需要通过相同的过程,则使用上述简单表达式可能会变得复杂。

谢谢

4

2 回答 2

2

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

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

尝试使用这个算法。创建排列。

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

于 2012-05-25T11:55:30.310 回答
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 one :这是您必须最小化的操作(因此,如果您只是在寻找 3 个数字,则在测试之前不要生成更多数字(更多的问题会有所不同)) .

于 2012-05-25T11:54:25.053 回答