循环从未达到最终价值

时间:2016-07-30 15:22:21

标签: c# random

这是我尝试为我的卡片软件创建的随机唯一数字生成器。它生成数字并写入数组OK。我在这里遇到循环问题。当整数i达到29时,它会停止增长并且代码无限循环并且永远不会达到30,这将停止循环。

如果没有if语句,它就会起作用,但它不会填满所需的范围。

修复了代码,现在工作正常,数组中的初始值是问题所在。现在我需要0-29值

    public partial class Form1 : Form
{
    int[] rndCards = new int[30];
    public Form1()
    {
        InitializeComponent();
        richTextBox1.Text = @"random numbers";


    }


    private void button1_Click(object sender, EventArgs e)
    {
        int i = 0;
        rndCards = new int[30];
        richTextBox1.Clear();
        Random rnd = new Random();
        while (i < 30)
        {
        int cardTest = rnd.Next(0, 30);
            while (rndCards.Contains(cardTest))
            {
                cardTest++;
                if (cardTest == 31)
                {
                cardTest = 1;
                }
            }
            rndCards[i] = cardTest;
            i++;    

        }
        i = 0;
        while (i < 30)
        {
            rndCards[i] = rndCards[i] -1;
            richTextBox1.Text += rndCards[i] + ", ";
            i++;
        }

    }
}

3 个答案:

答案 0 :(得分:2)

问题在于一个简单的事实,即数组在创建时已包含数字0(因为数组的每个项目都初始化为其成员类型的默认值)这就是为什么你应该从1开始你的i而不是零。

int i = 1;

替代更简单的方法:

您可以将其作为简单的随机数生成:

Random rnd = new Random();
rndCards = Enumerable.Range(0, 30).OrderBy(x => rnd.Next()).ToArray();

foreach(var card in rndCards)
{
    // do something
}

答案 1 :(得分:1)

rnd.Next(0,30)将返回0-29之间的随机数。

来自Random.Next(Int32, Int32)的文档:

  

Next(Int32,Int32)重载返回从minValue到maxValue的随机整数 - 1.但是,如果maxValue等于minValue,则该方法返回minValue。

使用int cardText = rnd.Next(0, 31);,这可以解决您的问题。

答案 2 :(得分:0)

上限是独占的(C# Random.Next - never returns the upper bound?)。

int cardTest = rnd.Next(0, 31);