C# 将数字随机分类为变量

C# 将数字随机分类为变量,c#,function,C#,Function,我是一名前python程序员,我已经开始尝试学习一种“成熟”的语言,即C#。但我需要功能方面的帮助。在python中,您可以编写如下函数 def mainloop: x = random.randint(1,100) print (x) mainloop() mainloop() 它将返回函数mainloop()。这是我正在处理的问题代码 public int getValue() { List<int> usedNumbers = new List

我是一名前python程序员,我已经开始尝试学习一种“成熟”的语言,即C#。但我需要功能方面的帮助。在python中,您可以编写如下函数

def mainloop:
    x = random.randint(1,100)
    print (x)
    mainloop()
mainloop()
它将返回函数mainloop()。这是我正在处理的问题代码

public int getValue()
{
    List<int> usedNumbers = new List<int>();
    Random rnd = new Random();
    int tempValue = rnd.Next(0, 27);

    if (usedNumbers.Contains(tempValue))
    {
        // Go back to getValue() to have the tempValue get a new value
    }
    else
    {
        usedNumbers.Add(tempValue);
        return tempValue;
    }
}
public int getValue()
{
List UsedNumber=新列表();
随机rnd=新随机();
int tempValue=rnd.Next(0,27);
if(usedNumbers.Contains(tempValue))
{
//返回getValue(),让tempValue获取新值
}
其他的
{
usedNumber.Add(tempValue);
返回值;
}
}

根据签名,您似乎希望:

private Random rnd = new Random();
public int getValue()
{
    return rnd.Next(0, 27);
}
但是根据方法的内容,您似乎希望返回一系列不重复的随机数

在这种情况下,您需要:

private Random rnd = new Random();
public IEnumerable<int> getValues()
{
    foreach (var value in Enumerable.Range(0, 26).OrderBy(x => rnd.Next()))
    {
        yield return value;
    }
}
我会得到这样的结果:

2,15,13,3,24,8,9,20,10,5,23,6,0,17,11,7,22,4,18,1,12,21,16,19,25,14


根据签名,您似乎想要:

private Random rnd = new Random();
public int getValue()
{
    return rnd.Next(0, 27);
}
但是根据方法的内容,您似乎希望返回一系列不重复的随机数

在这种情况下,您需要:

private Random rnd = new Random();
public IEnumerable<int> getValues()
{
    foreach (var value in Enumerable.Range(0, 26).OrderBy(x => rnd.Next()))
    {
        yield return value;
    }
}
我会得到这样的结果:

2,15,13,3,24,8,9,20,10,5,23,6,0,17,11,7,22,4,18,1,12,21,16,19,25,14


你的代码是递归的,所以我对它做了一点修改,这样它就可以工作了。然而,请注意,使用递归解决这个问题根本不是最优的,而且肯定会导致StackOvrflowException。@Enigmativity提出的解决方案绝对是可行的。这是一个更幽默的理论解决方案,遵循你原来的建议你

因为代码中没有真正的停止条件,所以我添加了一个简单的停止条件。递归调用将在随机创建5个ITME后停止:

public static List<int> getValue(List<int> numbers)
{
    List<int> usedNumbers = numbers;
    Random rnd = new Random();
    int tempValue = rnd.Next(0, 27);

    if (usedNumbers.Count == 5)
    {
        return usedNumbers;
    }

    if (usedNumbers.Contains(tempValue))
    {
        return getValue(usedNumbers);
    }
    else
    {
        usedNumbers.Add(tempValue);
        return getValue(usedNumbers);
    }
}
公共静态列表getValue(列表编号)
{
列表使用编号=编号;
随机rnd=新随机();
int tempValue=rnd.Next(0,27);
如果(UsedNumber.Count==5)
{
返回使用的号码;
}
if(usedNumbers.Contains(tempValue))
{
返回getValue(使用的数字);
}
其他的
{
usedNumber.Add(tempValue);
返回getValue(使用的数字);
}
}

让我再次强调一下:这只是为了说明如何使用递归方法解决这个问题。其他答案中已经提供了真实世界的解决方案。

您的代码是递归的,所以我对其进行了一些修改,使其能够正常工作。然而,请注意,使用递归解决这个问题根本不是最优的,而且肯定会导致StackOvrflowException。@Enigmativity提出的解决方案绝对是可行的。这是一个更幽默的理论解决方案,遵循你原来的建议你

因为代码中没有真正的停止条件,所以我添加了一个简单的停止条件。递归调用将在随机创建5个ITME后停止:

public static List<int> getValue(List<int> numbers)
{
    List<int> usedNumbers = numbers;
    Random rnd = new Random();
    int tempValue = rnd.Next(0, 27);

    if (usedNumbers.Count == 5)
    {
        return usedNumbers;
    }

    if (usedNumbers.Contains(tempValue))
    {
        return getValue(usedNumbers);
    }
    else
    {
        usedNumbers.Add(tempValue);
        return getValue(usedNumbers);
    }
}
公共静态列表getValue(列表编号)
{
列表使用编号=编号;
随机rnd=新随机();
int tempValue=rnd.Next(0,27);
如果(UsedNumber.Count==5)
{
返回使用的号码;
}
if(usedNumbers.Contains(tempValue))
{
返回getValue(使用的数字);
}
其他的
{
usedNumber.Add(tempValue);
返回getValue(使用的数字);
}
}

让我再次强调一下:这只是为了说明如何使用递归方法解决这个问题。其他答案中已经提供了现实世界的解决方案。

我无法确定您的最终目标是什么。你想要一个方法只返回一个随机数,还是想要一个方法在保持连续计数的同时返回一个随机数?是的,很难知道你想做什么。关键是
usedNumbers
是不需要的,因为在该函数中,您永远不会获得超过一个数字。我无法确定您的最终目标是什么。你想要一个方法只返回一个随机数,还是想要一个方法在保持连续计数的同时返回一个随机数?是的,很难知道你想做什么。关键是
usedNumbers
是不需要的,因为您在该函数上永远不会得到多个数字