2

// 创建一个包含十行的字符串数组。字符串 [] 个人号码;// 将personalNumbers 声明为10 元素数组personalNumbers = new string[10]; //= {“第一个数字”、“第二个数字”、“第三行”等}

        for (int i = 0; i < 9; i++)   // populate the array  with 10 random values
        {
            Random random = new Random();
            int randomNumber = random.Next(1, 50);

            string RandomNumberText = Convert.ToString(randomNumber);

            personalNumbers[i] = RandomNumberText;   
        }

嗨,我知道这似乎是以前提出的问题的重复,但我正在尝试生成 1 到 50 之间的一系列随机数来填充数组

问题是,如果我按照我们在课堂上教的那样做,每个数字都是一样的

我知道问题在于紧密的循环导致随机数以相同的数字播种

然而,其他线程都没有解决的是如何在使用循环迭代时解决这个问题......

到目前为止,所有的解释都远远超出了我们的水平,以至于我(和其他提问者顺便说一句)不知道如何将它们作为解决方案实施,我也无法在课堂上提交,因为它们是我们没有涵盖的技术

Microsoft 的教程坚持将随机数放入循环中是正确的解决方案

我尝试将 random 的实例放在循环之外,然后从循环内部调用它,但这导致了异常

有没有一种直接的方法可以使用 random 来创建一系列不会遇到这个问题的随机数?

4

4 回答 4

6

在循环外创建随机实例:

Random random = new Random();
for (int i = 0; i < 9; i++)   // populate the array  with 10 random values
{

MSDN

随机数生成从种子值开始。如果重复使用相同的种子,则会生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而为每个新的 Random 实例产生不同的序列。默认情况下,Random 类的无参数构造函数使用系统时钟生成其种子值,而其参数化构造函数可以根据当前时间的刻度数取一个 Int32 值。但是,由于时钟的分辨率有限,因此使用无参数构造函数来创建不同的 Random 对象以紧密连续地创建随机数 生成器,这些生成器会生成相同的随机数序列.

于 2013-11-03T22:09:03.360 回答
3

您必须Random在循环外定义对象,并且每次在循环内获取一个数字。如果你每次都创建它,它会被创建为相同的初始值,因为创建之间的间隔太小了。

Random random = new Random();

for (int i = 0; i < 9; i++) {
 int randomNumber = random.Next(1, 50);
} 
于 2013-11-03T22:09:36.940 回答
1

我尝试将 random 的实例放在循环之外,然后从循环内部调用它,但这导致了异常

下面是两个具体示例,一个用于控制台应用程序,另一个用于 WinForms 应用程序。

这是在控制台应用程序中声明它的一种方式。 random可以在应用程序中的任何地方使用,即使在 Main() 以外的方法中:

class Program
{

    private static Random random = new Random();

    static void Main(string[] args)
    {
        // ... code ...

        for (int i = 0; i < 9; i++)   // populate the array  with 10 random values
        {
            int randomNumber = random.Next(1, 50);

            personalNumbers[i] = randomNumber.ToString();
        }

        // ... code ...
    }

}

这是声明它以在 WinForms 应用程序中使用的一种方式。 random在这个例子中可以在 Form1 中的任何地方使用:

public partial class Form1 : Form
{

    private Random random = new Random();

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // ... code ...

        for (int i = 0; i < 9; i++)   // populate the array  with 10 random values
        {
            int randomNumber = random.Next(1, 50);

            personalNumbers[i] = randomNumber.ToString();
        }

        // ... code ...
    }

}

这应该涵盖最简单的家庭作业。这里没有什么花哨的。

于 2013-11-03T23:25:46.430 回答
0

感谢您的输入,非常感谢!

到目前为止,我已经发布了完整的代码,它现在给了我看起来像“随机”的数字,因为当我运行它时它们总是不同的

@Steve,谢谢...我已经查看了这些问题,但是所有解决方案都涉及使用我不允许使用的 random() 以外的其他技术

@Oerkelens 谢谢,当我将 random() 的代码移到循环之外时,我得到了两个可能的结果,一个是一系列 9 位、9 位随机数,或者一个异常说明

错误 1 ​​不能在此范围内声明名为“randomNumber”的局部变量,因为它会给“randomNumber”赋予不同的含义,后者已在“父级或当前”范围内用于表示其他内容

我已经发布了更大的代码来显示我为使其工作所做的更改...我真的不明白如何从循环中正确调用 random() ,但由于某种原因,具有相同的行循环内部和外部都成功了

@Preston - 我们没有这门课程的教科书,我们只能使用 Bob Tabor (learnvisualstudiodotnet) 和 Envato (30 天内学​​习 C#) 的 Microsoft C# 视频教程中包含的技术

如果这一切对您来说似乎很明显,我深表歉意,但是在课程进行到一半时,我们被告知我们正在从学习 Visual Basic 编程切换到 C#,所以我们现在所有的工作都需要重新- 用 C# 编写,没有任何关于如何使用这种语言的特定说明......不用说,这是一个巨大的压力,我们没有任何资源来做这件事,所以我们所做的大部分工作都是猜测

“工作”的更完整的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace GuessingGameProgram
{
class Program
{
    int randNum;
    static void Main(string[] args)
    {
        // Create a string array that consists of ten lines. 
        string[] personalNumbers; // declare personalNumbers as a 10-element array 
        personalNumbers = new string[10];  //= { "First number", "Second number", "Third line",   etc}

        Random outsideLoopRandom = new Random();
        int randomNumber = outsideLoopRandom.Next(1, 50);


        for (int i = 0; i < 9; i++)   // populate the array  with 10 random values
        {
            randomNumber = outsideLoopRandom.Next(1, 50);
            string RandomNumberText = Convert.ToString(randomNumber);

            personalNumbers[i] = RandomNumberText;   
        }

        // WriteAllLines creates a file, writes a collection of strings to the file, 
        // and then closes the file.
        //System.IO.File.WriteAllLines(@"C:\Users\Public\TestFolder\WriteLines.txt", lines);



        foreach (string i in personalNumbers) // this is just a test to see what the output is
        {
            Console.Write("{0} ", i);
        }


        Console.ReadLine();



    }
}

}

        //randNum = Random.Equals(1, 50);



        //StreamReader myReader = new StreamReader("personalNumbers.txt");
        //string line = "";
        //while (line != null)
        //{
        //    line = myReader.ReadLine();
        //    if (line != null)
        //        Console.WriteLine(line);
        //}

        //myReader.Close();
        //Console.ReadLine();

        //personalNumbers = RandomNumbers.next(1, 10);

        //int returnValue = personalNumbers.Next(1, 50);

        //int Guess = 0;

        //Console.WriteLine("Please guess a number between 1 and 50");
        //Console.ReadLine();
        ////while (Guess = Convert.ToInt32(Console.Read());

        //if (Guess < returnValue)
        //{
        //    Console.WriteLine("Wrong! the number that I am thinking of is higher than " + Guess + ". Try again!");
        //    Console.ReadLine();
        //}

        //if (Guess > returnValue)
        //{
        //    Console.WriteLine("Wrong! The number that I am thinking of is lower than " + Guess + ". Try again!");
        //    Console.ReadLine();
        //}
        //        else if (Guess = returnValue)
        //        Console.WriteLine("Correct! The number that I was thinking of was " + Guess + ". Congratulations!");
    //    //{
    //Console.WriteLine("Let's play a guessing game!")
    //Console.WriteLine("")
    //Console.WriteLine("guess a number between 1 and 10")
    //Console.WriteLine("")



    //randNum = randomGenerator.Next(1, 10)


    //While userGuess <> randNum
    //    {

    //    userGuess = Console.ReadLine()
    //    }
    //    If userGuess > randNum Then
    //        Console.WriteLine("too high, guess again!")
    //    {
    //   If userGuess < randNum Then
    //        Console.WriteLine("too low, guess again!")
    //    }
    //   Else


    //End While

    //Console.WriteLine("Correct! the secret number is " & randNum)
    //Console.ReadLine()
于 2013-11-03T23:52:42.550 回答