-2

I am very new to programming as a whole and C# is my first language. I have been working on this project for the past few weeks or so that gives the user 3 options of whether they want to use a random number generator, calculator or roll a dice.

So far everything is going okay. I have been focusing quite a lot on exception handling and commenting to make sure that everything is as clear as possible. One problem that I have come across and am not surer how to fix is that in my dice rolling procedure it prints out the same random dice number x times rather than printing out different random numbers each time. So if you could help me fix that that would be awesome. Here is just the code for that;

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

Also, as I'm a newbie in general, I think some feedback from more experienced users will benefit me as a whole. Is there any mistakes I've made> Any informal rules I have broken? Please let me know I will be very thankful. Here is all of the code;

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;
            }
        }
    }
  • If you look at the Random class it shows you how to get different random numbers, how you should initiate it so you dont get the same set of numbers. If you want a code review you should post there. – BugFinder Mar 07 '18 at 16:09
  • Create `Random` outside of the `for` loop. A new instance each time in quick succession will yield the same number output. – JSteward Mar 07 '18 at 16:10

1 Answers1

1

You should create the Random object only once, typically create is in a static field (if you create it many times, it would generate the same values every time)

static Random rnd = new Random();
Oxald
  • 837
  • 4
  • 10
  • To be accurate you should point out that it is possible the Random instances will generate the same number but only if they are created in very quick succession - the reason being the initial seed (if not specified) is based on the system clock. If the Random instances are created sufficiently slowly, they will generate different sequences. – PaulF Mar 07 '18 at 16:25