0

これはゲーム用です。52 個の要素を持つ配列があります。毎回これらの要素の一意のリストを作成できるようにしたいのですが、シーケンスの開始時または終了時に最初のいくつかの要素と最後の要素が同じになるリスクがあるため、ランダム化を使用したくありません。

本当にランダム化されたリストを使用しない場合、どうすればこれにアプローチできるかを考えています。それで、ランダム化されたリストでリストをシードすることから始めて、その後毎回リストを順序付けする独自の方法を実行すると、ランダムに見えますが、最初のいくつかは重複しません。そして最後の要素。

したがって、私が検討している 1 つの方法は、ランダム化されたリストの途中から始めて、1 つの要素を上に移動し、1 つの要素を下に移動して、リストの新しい順序を作成することです。その後は毎回、より適切な用語がないために同じ種類のシャッフルを行います。

人気があるかもしれないが、私は考えていない、これを行うための他のアプローチはありますか?

これを PHP で書き始めましたが、コードが機能しません。私のPHPコードが機能していなくても、これが順序付けの良いアプローチであると思われる場合は、親切にコメントしてください。ありがとう!

// First create an array of 52 elements, numbered 1…52.
for ($number=1; $number<=52; $number++)
    {
    $sequential_list[$number] = $number;
    }

print_r($sequential_list);

// Find the middle of $sequential_list

$middle = 26;

// Set the $middle as the first element in the new_list to seed it.
// Now go up one and down one from the $middle
    $new_list[1] = $sequential_list[$middle];
    $up = $middle;
    $down = $middle;
$index = 2; 

while ($index<=52)
    {
    $new_list[$index] = $sequential_list[$up++];
    echo "up is: " . $up . "\n";
    $new_list[$index++] = $sequential_list[$down--];
    }

print_r($new_list);

簡単な例は、1 から 52 までの番号が付けられた 52 個の要素の配列です。これは、中央から始まり、1 つ上に移動し、1 つ下に移動します。1 = 26、2 = 27、3 = 25、4 = 28、5 = 24、6 = 29、7 = 23 などとなります。

4

1 に答える 1

1
$middle = rand(5,47);//as not to get the first and last five elements int the same order

$first = array_slice($sequential_list, 0, $middle);
$second = array_slice($sequential_list, $middle);

shuffle($first);
shuffle($second);

$random_list = array_merge($second, $first);

次の反復では、新しい random_list から再度開始します。

于 2013-04-27T23:22:51.423 に答える