从文件输入生成的随机数

本文关键字:随机数 文件 输入 | 更新日期: 2023-09-27 17:53:05

我是c#编程的新手,我遇到了从输入读取文件生成随机数的问题。我试图从从文本文件

读取的以下输入的每行上的第二个字段生成随机数
4321,99
5432,79
6543,59
7654,39

该文件由以下代码读取,然后解析为单独的字段,其中调用一个方法来生成一个随机数

    private void readFileButton_Click(object sender, EventArgs e)
    {
        string readString;
        inputFile = File.OpenText(sourceFileString);
        while (!inputFile.EndOfStream)
        {
            readString = inputFile.ReadLine();
            var flds = readString.Split(',');
            string patID = flds[0];
            int months = Convert.ToInt32(flds[1]);
            Random();
        }
        inputFile.Close();
    }

我正在使用的方法,从第二个字段

生成随机数
    private void Random()
    {
        Random rand2Integer = new Random();
        randomInteger = rand2Integer.Next(1, months) + 1;
    }

然而,这个异常被抛出:'minValue'不能大于maxValue,我无法理解它。如果我使用文本框在表单上手动输入数据,则会按预期生成随机数。有什么建议可以指导我吗?

从文件输入生成的随机数

从您的代码中,看起来您有一个类变量months。但是,在读取文件时,声明了一个局部变量,它实际上隐藏了类变量。

现在当您使用随机函数时,使用类变量(必须为0并导致此错误)

替换下面的代码行

int months = Convert.ToInt32(flds[1]);

months = Convert.ToInt32(flds[1]);

Random()中的变量months与您在int months = Convert.ToInt32(flds[1]);中分配的变量不同,最后一个是本地方法

您应该在外部定义month或将其作为参数传递给Random()

编辑:

我做了一些小改动,使代码更容易阅读。希望能有所帮助。

private void readFileButton_Click(object sender, EventArgs e)
{
    // If you use the stream this way it will be disposed automatically.
    using (var sr = new StreamReader(sourceFileString))
    {
        while (!sr.EndOfStream)
        {
            string readString = sr.ReadLine();
            var flds = readString.Split(',');
            string patID = flds[0];
            int months = int.Parse(flds[1]);
            //I prefer parameters more than fields to communicate between methods.
            Random(months);
        }
    }
}
Random randomGenerator = new Random();
private void Random(int months)
{
    randomInteger = randomGenerator.Next(1, months) + 1;
}

readFile函数中,声明了一个名为months的变量,并将其初始化为文件中的数字。这看起来是正确的,可能工作得很好。

但是,该变量具有函数作用域。在类级别上,您可能有另一个名为"months"的变量(否则您将获得编译时错误)。"Random"方法使用的是这个变量,而不是"readFile"中设置的那个变量。将行改为:
months = Convert.ToInt32(flds[1]);

,它会工作。

作为题外话,您不应该每次需要绘制时都使用Random的新实例。更好的做法是为每个对象设置一个实例,并在每次需要新的随机数时重用它。