For循环不会完全迭代,但不会显示任何错误消息

时间:2018-08-13 20:21:35

标签: c# for-loop random

我有一个简单的程序,该程序使用Random和for循环来生成两个六位数字。循环每次都会生成两个数字,大多数情况下,两个数字都是六位数。但是,有时其中一个数字少于6位数字(4到5位数字)。在所有情况下,它都不会生成错误消息。这是怎么回事?我已经发布了所有代码,尽管其中一些尚未使用/经过测试,直到我找出随机问题为止。

六位数字以空字符串开头。 Random生成一个整数,该整数将转换为字符串,然后将+ =转换为六位数的数字字符串,该方法完成后将转换为整数。

该程序的其余部分尚未实现,将涉及提取每个数字中的第二,第四和第六位数字并将它们加在一起。麻烦的是随机问题。

static void Main(string[] args)
{
    Numbers theNumbers = new Numbers();
    Console.WriteLine(string.Join(",", theNumbers.Ints[0]));
    Console.WriteLine(string.Join(",", theNumbers.Ints[1]));
}

数字类

class Numbers
{
    public int[] Ints { get; set; }


    public Numbers()
    {
        Ints = new int[5];

        CreateTheFirstTwoNumbers(new RandomNummberGenerator());

    }

    public int[] CreateTheFirstTwoNumbers(RandomNummberGenerator RNG) 
    {
        for (int arrayIndex = 0; arrayIndex < 2; arrayIndex++)
        {
            Ints[arrayIndex] = RNG.CreateRandomNumber();
        }

        return Ints;
    }

随机数生成器类

class RandomNummberGenerator
{
    public Random  Generator { get; set; }

    public RandomNummberGenerator()
    {
        Generator = new Random();
    }

    public int CreateRandomNumber()
    {
        string number = "";

        for (int numberIndex = 0; numberIndex < 6; numberIndex++)
        {
            number += Generator.Next(0, 10).ToString();
        }

        return int.Parse(number);
    }
}

5 个答案:

答案 0 :(得分:2)

您正在生成一个六个字符的字符串,其中每个字符都是0到9(含0和9)之间的数字,然后将该字符串解析为整数。如果第一个字符为'0',则您将拥有一个包含五位数字的数字(如果有更多的前导零,则为更少的数字)。如果您想保证一个六位数的数字,那么您的第一位数应该是1-9,而不是0-9。

如果您还没看过,我建议您阅读how to debug small programs上Eric Lippert的博客文章。

答案 1 :(得分:2)

有一种更简单(更正确,并且当然需要更少的代码)解决方案来生成随机数,并将其转换为6个字符的字符串

var rng = new Random();
var number = rng.Next(1000000); // generates a number between 0 and 999999 
                                // (maxValue is exclusive upper bound)
var numberAsString = number.ToString("000000");

如果数字不能以前导零开头,请生成一个介于100000和999999之间的随机数:

var number = rng.Next(100000, 1000000); 

答案 2 :(得分:0)

除非您犯了语法错误,否则不会收到错误消息。您很可能有语义错误。如果我不得不猜测,我会说您的第一个数字有时会被生成为零。

答案 3 :(得分:0)

问题是当您将生成的数字转换为int时。

您的CreateRandom()函数有时会创建以0(zero)开头的数字,因此当您转换为int,float等数字类型时,将忽略左侧的零。

因此,如果在转换为int时生成012345,则会得到12345,因为左侧的0被禁止了。

如果您想要一个六位数的数字,请确保第一位数不是0

答案 4 :(得分:0)

您的循环实际上正在工作。当前导数字为0时,您得到的数字更少。

您可以使用以下格式强制显示六位数字

string s = number.ToString("000000");

例如,对于123,结果为"000123"

输出内容:

string s = String.Join(", ", theNumbers.Ints.Select(i => i.ToString("000000")).ToArray());
Console.WriteLine(s);