快速洗牌1到4的方法?

时间:2010-01-06 05:19:40

标签: c# random shuffle

希望改变四个变量(尝试更改它们在多选列表中出现的顺序)。

我一直在寻找一段时间,但我不能完全理解逻辑,在过去的问题中查找随机随机播放提供超出我的新手技能的超详细算法(以及此需求)程序我正在尝试编写,我只想制作一个多选图像选择器。)

理想情况下,我想要一些遵循此伪代码的内容:

// 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 个答案:

答案 0 :(得分: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());

答案 1 :(得分:5)

嗯,从技术上讲,谁在乎它是否只有4个数字的400个数字。您应该使用an implementation of 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);
}

上面演示的算法基本上是Fisher-Yates shuffle。实际上,您不会使用两个不同的列表来保存内容。您只需从尚未固定的阵列部分中选择一个随机元素并将其移动到其位置。单个列表的开头将是固定元素,而结束将是可能性。

答案 2 :(得分: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

答案 3 :(得分: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);
        }

编辑 - 您可以将这些数字添加到新列表中,而不仅仅是打印数字。