RNG未知错误

时间:2017-04-22 04:03:11

标签: c# random

尝试制作在高值和低值之间随机生成X量随机数的代码。该代码还应该防止生成相同的随机数。

这是我到目前为止的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Randonnumbers
{
    class Program
    {

        static void Main(string[] args)
        {
            int lowrange = 0; // Establishing the variables for lowest number, highest number, and total numbers generated.
            int highrange = 50;
            int numberof = 10;
            var generated = new List<int>(); // Creates a list of numbers that have been generated already to prevent double-ups.
            var rng = new Random();
            Console.WriteLine("Numbers Generated:");
            while (numberof > 0) //Repeats this loop once for each "numberof". (until the number hits zero)
            {
                generatenewnumber(); //Calls the function above
            }
            Console.ReadLine(); // Here so the program doesnt instantly close
        }

        public void generatenewnumber()
        {
            int number = rng.Next(lowrange, highrange); //Sets the number to a random number between the high and low values.
            if (!generated.Contains("number")) // Checks if the rg'd number has already been made.
            {
                generatenewnumber(); //If it has, it will re-run this function.
            }
            else
            {
                numberof = numberof - 1;
                generated.Add(number); // Adds the genereated number to the list.
                Console.WriteLine(number); // Prints the number. 
            }
        }
    }
}

不确定错误的位置。 程序不会运行,也不会显示任何错误。

也许它与在某个条件下从内部调用函数有关?老实说,我不知道,我是c#.c#

的新手

2 个答案:

答案 0 :(得分:0)

在行中:

        if (!generated.Contains("number")) // Checks if the rg'd number has already been made.
        {
            generatenewnumber(); //If it has, it will re-run this function.
        }

应该!generated.Contains(“number”)没有数字,即

generated.Contains(8);!?

或变量

int temp = 8;
!generated.Contains(temp);

虽然非常不可能,但在其自身内部调用“generatenewnumber()”有可能无限生成列表中已有的数字。如果你设置一个do / while()循环怎么办:像

    public void generatenewnumber()
    {
        int number;
        do
        {
            number = rng.Next(lowrange, highrange); //Sets the number to a random number between the high and low values.
        }while(generated.Contains(number)) // Checks if the rg'd number has already been made.

        numberof = numberof - 1;
        generated.Add(number); // Adds the genereated number to the list.
        Console.WriteLine(number); // Prints the number. 
    }

这将删除可能导致您的问题的递归调用

答案 1 :(得分:0)

这里有几个问题:

首先:您正尝试在不同的函数中使用具有局部作用域的变量。

功能generatenewnumber() 从未听说过lowrangehighrangenumberofgenerated

有两种方法可以解决这个问题。一种是将所需的变量作为函数的参数传递:

public static void generatenewnumber(int lowrange, int highrange, int numberof, List<int> generated) 

另一个是全局宣布它们。为此,你必须在类中声明它们,但在任何函数之外。

第二次:您需要调用一个函数并让它永久更改传递的值,例如使用numberof。这不起作用。通常,参数是“按值调用”,这意味着函数中的变量只是原始变量的一个副本,所有更改都不是持久的。如果您希望它们是持久的,您必须进行“按引用调用”。这可能如下所示:

public static void generatenewnumber(int lowrange, int highrange, ref int numberof, ref List<int> generated)

像这样被召唤:

generatenewnumber(lowrange, highrange, ref numberof, ref generated);

<强>第三rng.Next不是真正的命令。您可以在此处找到正确的方法: How do I generate a random int number in C#?