5

4 つの変数をシャッフルしようとしています (複数選択リストに表示される順序を変更しようとしています)。

私はしばらくいじっていましたが、ロジックに頭を悩ませることはできません。過去の質問でランダムなシャッフルを調べると、初心者のスキルを超えた非常に詳細なアルゴリズムが得られます (そして、このプログラムのニーズ書き込もうとしているのですが、複数選択の画像ピッカーを作りたいだけです)。

理想的には、この疑似コードに従うものが欲しいです:

// int Answer1 = Random(min1 max4)

// int Answer2 = Random(min1 max4)

// int Answer3 = Random(min1 max4)

// int Answer4 = Random(min1 max4)

// If Answer 1 equals ANY of the other three, re-randomize Answer1 and loop.

// Loop through this cycle for all answers.

現在の通常のコードを投稿しますが、率直に言って、それはゴミです。:(これは十分に単純な問題のように思えますが、私はそれを正しく理解できません.

前もって感謝します!

4

4 に答える 4

8

シャッフル - http://www.codinghorror.com/blog/archives/001008.html

ただし、GUID を使用しないで、乱数を使用してください。

//create only once, please
static readonly Random random = new Random();

その後:

var numbers = Enumerable.Range(1, 4);
var shuffle = numbers.OrderBy(a => random.NextDouble());
于 2010-01-06T05:24:04.343 に答える
5

技術的には、400 個の数字のうちの 4 つの数字だけであっても、誰が気にしますか。Fisher-Yates shuffle の実装を使用する必要があります。ただし、理解しやすくするために、次のようにします。

var possibleNumbers = new List<int>(Enumerable.Range(1, 4));
var result = new List<int>(4);
var rnd = new Random();
while (possibleNumbers.Count > 0) {
    int r = rnd.Next(possibleNumbers.Count);
    result.Add(possibleNumbers[r]);
    possibleNumbers.RemoveAt(r);
}

上で示したアルゴリズムは、基本的にフィッシャー・イェーツ シャッフルです。実際には、物を保持するために 2 つの異なるリストを使用することはありません。まだ修正していない配列の部分からランダムな要素を選択し、その場所に移動するだけです。単一リストの先頭は固定要素になり、最後は可能性になります。

于 2010-01-06T05:25:19.670 に答える
5

私はこの拡張方法が好きです:

static class IListExtensions {
    public static void Shuffle<T>(this IList<T> list, Random rg) {
        for (int i = list.Count; i > 1; i--) {
            int k = rg.Next(i);
            T temp = list[k];
            list[k] = list[i - 1];
            list[i - 1] = temp;
        }
    }
}

それで:

Random rg = new Random();
List<int> list = Enumerable.Range(1, 4).ToList();
list.Shuffle(rg);

のシャッフルlistです{1, 2, 3, 4}

ここで使用したアルゴリズムは、Fisher-Yates shuffleです。

于 2010-01-06T05:27:06.087 に答える
0
        Random rand = new Random();
        List<int> choices = new List<int>() { 1, 2, 3, 4 };

        while (choices.Count > 0)
        {
            int index = rand.Next() % choices.Count;
            int choice = choices[index];
            Console.WriteLine(choice);
            choices.RemoveAt(index);
        }

編集 - 数値を印刷するだけでなく、明らかに新しいリストに追加できます。

于 2010-01-06T05:25:23.600 に答える