快速洗牌1到4的方法?

use*_*494 5 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.
Run Code Online (Sandbox Code Playgroud)

我发布了我当前的常规代码,但坦率地说,这是垃圾.:(这似乎是一个简单的问题,但我只是不能正确.

提前致谢!

Kob*_*obi 8

改组 - http://www.codinghorror.com/blog/archives/001008.html

但是,不要使用guid,请使用随机数:

//create only once, please
static readonly Random random = new Random();
Run Code Online (Sandbox Code Playgroud)

然后:

var numbers = Enumerable.Range(1, 4);
var shuffle = numbers.OrderBy(a => random.NextDouble());
Run Code Online (Sandbox Code Playgroud)


Meh*_*ari 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);
}
Run Code Online (Sandbox Code Playgroud)

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


jas*_*son 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

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

现在list是一个洗牌{1, 2, 3, 4}.

我在这里使用的算法是Fisher-Yates shuffle.