当我正在学习C#时,我正在重新创建我在python中执行的一个旧项目,这是一个D& D风格的字符随机函数。我正在研究随机数据生成,但我似乎无法获得实际值,而不是System.Collections.Generic.List
1 [System.Int32]'错误。
Python代码:
def char_stats(self):
# roll 4 D6s drop the lowest number and add the highest 3
# this is done for each stat slot
stats = []
for x in range(6):
rolls =[randint(1,6) for i in range(4)]
rolls.sort()
stats.append(sum(rolls[1:]))
return stats
到目前为止我的C#代码:
List<int> rolls = new List<int>();
Random rollrnd = new Random();
IEnumerable<int> range = Enumerable.Range(1, 4);
for (int i = 0; i < 6; i++)
{
rolls.Add(rollrnd.Next(1,6));
Console.WriteLine(rolls);
//System.Collections.Generic.List`1[System.Int32]
// loop to go with Enumerable
//foreach (int n in range){}
}
答案 0 :(得分:4)
如果要显示序列的所有元素,可以执行以下操作:
Console.WriteLine(string.Join(",", rolls));
你对random.Next的调用是错误的。我不知道python做了什么,但不幸的是,在C#Next(1, 6)
中给出了从1到5的随机数。
问题空间的一个有用助手是无限骰子序列:
static Random random = new Random();
static IEnumerable<int> Dice(int n) {
while(true)
yield return random.Next(1, n + 1);
}
现在您可以使用序列运算符。例如,滚动四,丢弃最低,并将结果汇总为:
Dice(6).Take(4).OrderBy(x => x).Skip(1).Sum();
注意如何通过使用序列运算符来避免完全执行循环和范围。当然Take和Skip中有循环,但这是他们的业务。您不需要循环污染您的代码。使你的代码看起来像它编码的操作:滚动一些骰子,丢弃一些,总结它们。
答案 1 :(得分:1)
在您的C#代码中,您没有收到错误。 Console.WriteLine(rolls)
显示的返回值为rolls.ToString()
,即 System.Collections.Generic.List1 [System.Int32] 。如果您想要显示rolls
中存储的各个值,则需要使用如下代码:
for (int i = 0; i < 6; i++)
{
int roll = rollrnd.Next(1,6);
rolls.Add(roll);
Console.WriteLine(roll);
}
答案 2 :(得分:1)
另一种方法是使用Generic List ForEach方法,如下所示,我也将vars放入,因为这被视为良好做法:
var rolls = new List<int>();
var rollrnd = new Random();
for (var i = 0; i < 6; i++) {
rolls.Add(rollrnd.Next(1, 6));
}
rolls.ForEach(x=> Console.WriteLine(x)); // These lines are equivalent
rolls.ForEach(Console.WriteLine); // Just showing another way of doing it.
}