随机分类的数字到变量

时间:2015-12-16 02:04:59

标签: c# function

我是一名前蟒蛇程序员,我已经尝试学习一种“成熟”的语言,即C#。但我需要有关功能的帮助。在python中你可以写一个函数,比如

def mainloop:
    x = random.randint(1,100)
    print (x)
    mainloop()
mainloop()

它将返回到funtion 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;
    }
}

2 个答案:

答案 0 :(得分:5)

根据签名,您似乎想要这样:

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

你甚至可以将其缩短为:

private Random rnd = new Random();
public IEnumerable<int> getValues()
{
    return Enumerable.Range(0, 26).OrderBy(x => rnd.Next());
}

如果我这样做了:

var x = String.Join(", ", getValues());

我会得到这样的东西:

  

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

答案 1 :(得分:0)

你的代码是递归的,所以我稍微改了一下,所以它有效。但请注意,使用递归解决此问题并不是最佳选择,并且肯定会导致StackOvrflowException。 @Enigmativity建议的解决方案绝对是可行的方法。这个更像是用一个符合你原始建议的理论解决方案来幽默你。

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

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

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