【问题标题】:For loop that doesn't iterate completely but displays no error message未完全迭代但不显示错误消息的 for 循环
【发布时间】:2018-08-13 20:21:34
【问题描述】:

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

六位数字以空字符串开头。随机生成一个整数,整数转换为字符串,然后 += 转换为六位数字字符串,当方法完成时将其转换为整数。

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

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

【问题讨论】:

  • 仅包含与您的问题相关的代码,这些//unused cmets 向我表明没有使用代码,因此请从您的问题中删除它
  • 欢迎堆栈溢出。为了最大限度地提高您获得帮助的机会,请尝试提供minimal, complete, verifiable example您遇到的问题
  • @aGuy 您可以通过Generator.Next(100000, 1000000) 为您的生成器播种,使其仅产生 6 位数字,是否有理由不能只获得随机的 6 位数字而不是获得随机数0 - 9 并将它们附加在一起?

标签: c# for-loop random


【解决方案1】:

有一个更简单(更正确,当然需要更少代码)的解决方案来生成随机数并将其转换为 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); 

【讨论】:

  • +1,但我认为 Next() 的第二个参数应该是 1000000 而不是 999999,因为那个参数是 an exclusive upper bound
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      所以,如果你在转换为 int 时生成012345,你会得到12345,因为左边的 0 被抑制了。

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

      【讨论】:

        【解决方案5】:

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

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

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

        例如,123 的结果是 "000123"

        输出:

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

        【讨论】:

          猜你喜欢
          • 2016-03-03
          • 1970-01-01
          • 1970-01-01
          • 2023-03-30
          • 2014-04-03
          • 1970-01-01
          • 2021-08-02
          • 1970-01-01
          • 2013-07-02
          相关资源
          最近更新 更多