C#随机数生成器每次仍然给出相同的数字

时间:2013-11-03 22:07:53

标签: c# random

//创建一个由十行组成的字符串数组。             string [] personalNumbers; //将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;   
        }

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

问题是,如果我按照课堂上的教学方式进行,每个数字都是相同的

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

其他线程没有解决的问题是,如何在使用循环迭代时修复此问题....

到目前为止,所有的解释都超出了我们的水平,我(以及其他问题BTW)不知道如何将它们作为一种解决方案实施,我也无法在课堂上提交,因为它们是我们拥有的技术未涵盖

微软的教程坚持认为将随机内置于循环中是正确的解决方案

我尝试在循环外部放置一个随机实例,然后从循环内部调用它,但这导致异常

是否有一种直接的方法可以使用随机数来创建一系列不会遇到此问题的随机数?

4 个答案:

答案 0 :(得分:5)

在循环外创建随机实例:

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

MSDN

  

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

答案 1 :(得分:2)

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

Random random = new Random();

for (int i = 0; i < 9; i++) {
 int randomNumber = random.Next(1, 50);
} 

答案 2 :(得分:0)

  

我尝试在循环之外放置一个随机实例然后   从循环内部调用它但这导致异常

以下是两个具体的示例,一个用于控制台应用,另一个用于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 ...
    }

}

这应该涵盖大多数简单的家庭作业。没什么好看的。

答案 3 :(得分:0)

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

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

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

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

的例外

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

我已经发布了更大的代码来显示我已经改变它以使其工作...我真的不明白如何从循环内正确调用random(),但出于某种原因,循环内外的同一行做了诀窍

@Preston - 我们没有本课程的教科书,我们只允许使用Bob Tabor(learnvisualstudiodotnet)和Envato(30天内学习C#)的Microsoft C#视频教程中包含的技术< / p>

我很抱歉,如果这一切对您来说显而易见,但我们处于被告知我们正在从学习到使用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()