首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >混洗数组-缺少数字c#

混洗数组-缺少数字c#
EN

Stack Overflow用户
提问于 2015-04-21 19:39:42
回答 4查看 108关注 0票数 0

我真的很纠结于如何表达这一点,但我正在用C#创建一个程序,它基本上是随机输出它,但为了避免重复,我从ArrayList中删除了它。

现在它可以工作了,但有时它会覆盖一个已经说过的当前数字,并留下一个空按钮。

我将展示我的代码如下:

代码语言:javascript
运行
复制
Button[] buttons = new Button[3];
        int questionNumber = 0;
        int qNumber = 0;
        int x = 1;


Random r = new Random();
            List<Button> listOfButtons = new List<Button>();
            listOfButtons.Add(buttons[0]);
            listOfButtons.Add(buttons[1]);
            listOfButtons.Add(buttons[2]);



            int rIndex;

            while (qNumber < 3)
            {
                rIndex = r.Next(0, listOfButtons.Count); //Choose a random object from list
                listOfButtons[rIndex].Text = qAnswer[questionNumber, x++]; // adds text to button
                listOfButtons.Remove(buttons[rIndex]); // removes button from index
                qNumber++;


            }



private void EasyLevel_Load(object sender, EventArgs e)
        {
            buttons[0] = a1; // a1 is button
            buttons[1] = a2;
            buttons[2] = a3;
        }
EN

回答 4

Stack Overflow用户

发布于 2015-04-21 20:02:06

有很多方法可以解决这个问题,但我建议使用这个简单的方法:

1)使用一个混洗器类来混洗数组。这个使用的是Fisher-Yates shuffle

代码语言:javascript
运行
复制
public class Shuffler
{
    public Shuffler()
    {
        _rng = new Random();
    }

    public void Shuffle<T>(IList<T> array)
    {
        for (int n = array.Count; n > 1; )
        {
            int k = _rng.Next(n);
            --n;
            T temp = array[n];
            array[n] = array[k];
            array[k] = temp;
        }
    }

    private readonly Random _rng;
}

2)你有一个问题集合,你想以随机的顺序访问这些问题。如果问题在数组或列表中,您可以直接对其进行混洗。如果它们不是(我假设是这样),那么您可以从0..n-1创建一个索引列表,其中n是问题的数量:

代码语言:javascript
运行
复制
var indices = Enumerable.Range(0, qAnswer.Count()).ToArray();

3)然后对这些索引进行混洗:

代码语言:javascript
运行
复制
var shuffler = new Shuffler();
shuffler.Shuffle(indices);

4)最后,您可以使用这些索引(现在是随机顺序)以随机顺序访问问题:

代码语言:javascript
运行
复制
foreach (var index in indices)
    buttons[0].Text = qAnswer[questionNumber, index];

(从您发布的代码中,我不确定它应该是qAnwser[questionNumber, index]还是qAnswer[index, questionNumber]或其他什么,所以您可能必须更改它……)

票数 0
EN

Stack Overflow用户

发布于 2015-04-21 20:02:16

如果需要按随机顺序对列表进行排序,请使用实现IComaprer<T>的比较器

这是我几年前写的一个RandomComparer,它一次又一次地证明了自己是有用的:

代码语言:javascript
运行
复制
public class RandomComparer<T> : IComparer<T>
{
    private Random rnd;
    public RandomComparer() {
        rnd = new Random();
    }

    public RandomComparer(int Seed) {
        rnd = new Random(Seed);
    }
    public int Compare(T x, T y)
    {
        return rnd.Next(-1, 2);
    }
}

要使用它,只需编写以下代码:listOfButtons.Sort(new RandomComparer<Button>());

票数 0
EN

Stack Overflow用户

发布于 2015-04-21 20:04:59

我认为你遇到了问题,因为listOfButtons.Remove(buttons[rIndex])并没有像你想象的那样检查对象的相等性。

请尝试使用listOfButtons.RemoveAt(rIndex)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29771200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档