随机数组 - 缺少数字c#

时间:2015-04-21 11:39:42

标签: c# arrays

我真的很想解决这个问题,但是我在C#中创建了一个程序,基本上会将其输出,但为了避免重复,我将它从ArrayList中删除。

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

我将在下面显示我的代码:

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;
        }

4 个答案:

答案 0 :(得分:0)

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

1)使用shuffler类来重排数组。这个使用Fisher-Yates shuffle

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是问题的数量:

var indices = Enumerable.Range(0, qAnswer.Count()).ToArray();

3)然后你洗牌那些指数:

var shuffler = new Shuffler();
shuffler.Shuffle(indices);

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

foreach (var index in indices)
    buttons[0].Text = qAnswer[questionNumber, index];

(我不确定您发布的代码是{@ 1}}还是qAnwser[questionNumber, index]还是其他内容,所以您可能需要更改...

答案 1 :(得分:0)

如果您需要以随机顺序对列表进行排序,请使用实现IComaprer<T>的比较器 这是我几年前写的一个随机比较,它已经证明了自己有用的时间:

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>());

答案 2 :(得分:0)

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

请尝试使用listOfButtons.RemoveAt(rIndex)

答案 3 :(得分:0)

循环使用按钮而不是文本的不同方法:

Button[] buttons = new Button[] 
{
    button1,
    button2,
    button3
};

List<string> text = new List<string>() {"1", "2", "3"};

Random random = new Random();

foreach (var button in buttons)
{
    string str = text[random.Next(0, text.Count() - 1)];
    button.Text = str;
    text.Remove(str);
}