C# 1.如何使我的随机数在每次打印时都不一样?2.有什么基本的东西我可以改进吗?

C# 1.如何使我的随机数在每次打印时都不一样?2.有什么基本的东西我可以改进吗?,c#,console-application,C#,Console Application,作为一个整体,我对编程非常陌生,C是我的第一语言。在过去的几周左右,我一直在做这个项目,这给了用户3个选项,他们是想使用随机数生成器、计算器还是掷骰子 到目前为止一切都很顺利。我一直非常关注异常处理和注释,以确保一切尽可能清晰。我遇到的一个问题是,在掷骰子的过程中,它会打印出相同的随机骰子数x次,而不是每次打印出不同的随机数,我不确定如何解决这个问题。如果你能帮我解决这个问题,那就太棒了。这里只是代码 static void rollDice() { Boolean ro

作为一个整体,我对编程非常陌生,C是我的第一语言。在过去的几周左右,我一直在做这个项目,这给了用户3个选项,他们是想使用随机数生成器、计算器还是掷骰子

到目前为止一切都很顺利。我一直非常关注异常处理和注释,以确保一切尽可能清晰。我遇到的一个问题是,在掷骰子的过程中,它会打印出相同的随机骰子数x次,而不是每次打印出不同的随机数,我不确定如何解决这个问题。如果你能帮我解决这个问题,那就太棒了。这里只是代码

static void rollDice()
    {
        Boolean rollAgain = false;
        while (rollAgain == false)
        {
            Console.Write("Enter the number of sides on your dice: "); //Need to do exception handling for this
            int totalSides = int.Parse(Console.ReadLine());
            Console.WriteLine("How many times would you like to roll the {0} sided dice?", totalSides); //Need to do exception handling for this
            int numRolls = int.Parse(Console.ReadLine());
            for (int i = 0; i < numRolls; i++)
            {
                Random rnd = new Random();
                int diceNumber = rnd.Next(1, totalSides);
                Console.Write("\t" + diceNumber);
            }
            Console.WriteLine("\nIf you like to roll a dice with a different number of sides enter Y\nTo exit the application enter N");
            string doRerun = Console.ReadLine();
            if (doRerun == "Y" || doRerun == "y")
            {
                rollAgain = false;
            }
            else if (doRerun == "N" || doRerun == "n")
            {
                rollAgain = true;
            }
        }
    }
另外,由于我是一个新手,我认为来自经验丰富的用户的一些反馈将使我整体受益。我犯了什么错误>违反了什么非正式规则?请让我知道我将非常感激。这里是所有的代码

static void Main(string[] args)
    { 
        Boolean chooseRun = false;
        while (chooseRun == false)
        {
            Console.WriteLine("To use the calculator enter C\nTo use the random number generator enter R\nTo roll a dice enter D");
            string chooseProc = Console.ReadLine();
            if (chooseProc == "C" || chooseProc == "c")
            {
                calculator();
                chooseRun = true;
            }
            else if (chooseProc == "R" || chooseProc == "r")
            {
                numGenerator();
                chooseRun = true;
            }
            else if (chooseProc == "D" || chooseProc == "d")
            {
                rollDice();
                chooseRun = true;
            }
            else
            {
                Console.WriteLine("Sorry that was an invalid input. Please try again");
                chooseRun = false;
            }
        }
        Console.Write("Goodbye");
        Console.ReadKey();
    }
    /// <summary>
    /// Here I have a simple calculator that can do basic functions such as subtraction and then I give them the option to use it again
    /// </summary>
    static void calculator()
    {
        int loop = 1;

        while (loop == 1)
        {
            Console.WriteLine("You chose to use the calculator!\nPress the enter key to start"); //Greet the user and give them the option of when they want to start the calculator based upon when they choose to click the enter key
            Console.ReadKey(true);

            int num1 = 0; //Declaring variables 
            int num2 = 0;
            string operation = "";
            int answer;

            Boolean gotnum1 = false;
            while (gotnum1 == false)
            {
                Console.Write("Enter the first number in your equation: "); //Then I give them a message to greet them and give them the option of when to start the calculator  
                try
                {
                    num1 = int.Parse(Console.ReadLine());
                    gotnum1 = true;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }

            Boolean gotnum2 = false;
            while (gotnum2 == false)
            {
                Console.Write("Enter the second number in your equation: "); //Then I give them a message to greet them and give them the option of when to start the calculator  
                try
                {
                    num2 = int.Parse(Console.ReadLine());
                    gotnum2 = true;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
            Boolean gotOpr = false;
            while (gotOpr == false)
            {
                Console.Write("Ok now enter your operation ( x , / , +, -) ");
                operation = Console.ReadLine();
                switch (operation)
                {
                    case "x":
                        answer = num1 * num2;
                        Console.WriteLine(num1 + " " + operation + " " + num2 + " = " + answer);
                        gotOpr = true;
                        break;
                    case "X":
                        answer = num1 * num2;
                        Console.WriteLine(num1 + " " + operation + " " + num2 + " = " + answer);
                        gotOpr = true;
                        break;
                    case "/":
                        try
                        {
                            answer = num1 / num2;
                            Console.WriteLine(num1 + " " + operation + " " + num2 + " = " + answer);
                            gotOpr = true;
                        }
                        catch (DivideByZeroException e)
                        {
                            Console.WriteLine("You cannot divide by zero");
                        }
                        break;
                    case "+":
                        answer = num1 + num2;
                        Console.WriteLine(num1 + " " + operation + " " + num2 + " = " + answer);
                        gotOpr = true;
                        break;
                    case "-":
                        answer = num1 - num2;
                        Console.WriteLine(num1 + " " + operation + " " + num2 + " = " + answer);
                        gotOpr = true;
                        break;
                    default:
                        Console.WriteLine("Sorry that is an invalid input");
                        gotOpr = false;
                        break;
                }
            }

            Console.WriteLine("Do you want to use the calculator again? Select;\nIf you would please enter /Y/\nIf not please enter /N/");
            string rerun = Console.ReadLine();
            if (rerun.ToUpper() == "N")
            {
                loop = 0;
            }
        }
    }
    /// <summary>
    /// This procedure generates a random number and gives the user the option as to whether they would like to generate another 
    /// </summary>
    static void numGenerator()
    {
        Console.WriteLine("You chose to use the random number generator");
        Boolean moreNum = false;
        while (moreNum == false)
        {
            Random r = new Random();
            int n = r.Next();
            Console.WriteLine(n);
            Console.WriteLine("If you would like another number enter Y, otherwise please enter N");
            string rerun = Console.ReadLine();
            if (rerun == "Y" || rerun == "y")
            {
                moreNum = false;
            }
            else if (rerun == "N" || rerun =="n")
            {
                moreNum = true;
            }
        }
    }
    /// <summary>
    /// In this procedure a virtual dice is rolled of a user inputted number of times, this too gives the user the option to roll the dice again after rolling it x times
    /// </summary>
    static void rollDice()
    {
        Boolean rollAgain = false;
        while (rollAgain == false)
        {
            Console.Write("Enter the number of sides on your dice: "); //Need to do exception handling for this
            int totalSides = int.Parse(Console.ReadLine());
            Console.WriteLine("How many times would you like to roll the {0} sided dice?", totalSides); //Need to do exception handling for this
            int numRolls = int.Parse(Console.ReadLine());
            for (int i = 0; i < numRolls; i++)
            {
                Random rnd = new Random();
                int diceNumber = rnd.Next(1, totalSides);
                Console.Write("\t" + diceNumber);
            }
            Console.WriteLine("\nIf you like to roll a dice with a different number of sides enter Y\nTo exit the application enter N");
            string doRerun = Console.ReadLine();
            if (doRerun == "Y" || doRerun == "y")
            {
                rollAgain = false;
            }
            else if (doRerun == "N" || doRerun == "n")
            {
                rollAgain = true;
            }
        }
    }

您应该只创建一次随机对象,通常在静态字段中创建。如果您多次创建随机对象,则每次都会生成相同的值

static Random rnd = new Random();

如果你看Random类,它会告诉你如何得到不同的随机数,你应该如何初始化它,这样你就不会得到相同的一组数。如果你想查看代码,你应该在那里发布。在for循环之外创建随机的。每次快速连续创建一个新实例将产生相同的数字输出。准确地说,您应该指出,随机实例可能会生成相同的数字,但只有在非常快速连续创建的情况下才会产生相同的数字-原因是如果未指定初始种子,则基于系统时钟。如果随机实例的创建速度足够慢,它们将生成不同的序列。