循环永远不会达到最终值

本文关键字:永远 循环 | 更新日期: 2023-09-27 17:59:28

这是我试图为我的卡片软件创建的随机唯一数字生成器。它生成数字并写入数组。我对这里的循环有问题。当整数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++;
        }
    }
}

循环永远不会达到最终值

问题在于创建数组时数组已经包含数字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
}

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

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

下一个(Int32,Int32)重载返回范围从minValue到maxValue–1的随机整数。但是,如果maxValue等于minValue,则该方法将返回minValue。

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

上界是互斥的(C#随机。下一步-从不返回上界?)。

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