0

1 から 9 までの 3 つの乱数をそれぞれ生成する必要があり、各数値は他の数値と一致してはなりません。現在、以下のスクリプトを使用してこれを行っていますが、これは正常に動作しますが、これを行うための他のより効率的な方法があるかどうか疑問に思っていましたか?

$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

このalgを使用してみてください。順列を作成します。

このソリューションは、選択する必要がある数の範囲と要素の数の両方でスケーラブルです。数字の範囲 (例: 1 ~ 9) が一意である限り、このソリューションでは、選択した 3 つの数字が繰り返されることはありません。

于 2012-05-25T11:55:30.310 に答える
0

毎回 3 つの数値を生成する必要はありません。

最初のステップは次のとおりです。

$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 つの数値を探しているだけの場合は、テストする前にそれ以上の数値を生成しないでください (問題はそれ以上になると異なります))。 .

于 2012-05-25T11:54:25.053 に答える