我是一名前蟒蛇程序员,我已经尝试学习一种“成熟”的语言,即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;
}
}
答案 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);
}
}
让我再强调一下:这只是为了说明如何使用递归方法解决这个问题。其他答案中已经提供了真实世界的解决方案。