将Python转换为C# - 随机数组

时间:2017-05-26 14:10:58

标签: c# python-2.7

当我正在学习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){}
}

3 个答案:

答案 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.
    }