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

C# 将Python转换为C-随机数组,c#,python-2.7,C#,Python 2.7,在学习C语言的过程中,我正在重新创建我在python中完成的一个旧项目,它是一个D&D风格的字符随机化器。我正在进行随机统计生成,但似乎在获取实际值时遇到问题,而不是System.Collections.Generic.List1[System.Int32]错误 Python代码: def char_stats(self): # roll 4 D6s drop the lowest number and add the highest 3 # this is done for e

在学习C语言的过程中,我正在重新创建我在python中完成的一个旧项目,它是一个D&D风格的字符随机化器。我正在进行随机统计生成,但似乎在获取实际值时遇到问题,而不是System.Collections.Generic.List1[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){}
}

在你的C代码中,你没有得到一个错误。Console.WriteLinerolls显示rolls.ToString的返回值,即System.Collections.Generic.List1[System.Int32]。如果要显示存储在转鼓中的各个值,则需要使用如下代码:

for (int i = 0; i < 6; i++)
{
    int roll = rollrnd.Next(1,6);
    rolls.Add(roll);
    Console.WriteLine(roll);
}

在你的C代码中,你没有得到一个错误。Console.WriteLinerolls显示rolls.ToString的返回值,即System.Collections.Generic.List1[System.Int32]。如果要显示存储在转鼓中的各个值,则需要使用如下代码:

for (int i = 0; i < 6; i++)
{
    int roll = rollrnd.Next(1,6);
    rolls.Add(roll);
    Console.WriteLine(roll);
}

如果要显示序列的所有元素,可以执行以下操作:

Console.WriteLine(string.Join(",", rolls));
你打给random.Next的电话错了。我不知道python做什么,但不幸的是,在C Next1中,6给出了从1到5的随机数

对你的问题空间来说,一个有用的助手是一个无限的掷骰子序列:


请注意,使用序列运算符可以避免完全执行循环和范围。当然,Take和Skip中有循环,但这是他们的事。您不需要循环来污染代码。使您的代码看起来像它正在编码的操作:掷一些骰子,丢弃一些骰子,对它们求和。

如果要显示序列的所有元素,可以执行以下操作:

Console.WriteLine(string.Join(",", rolls));
你打给random.Next的电话错了。我不知道python做什么,但不幸的是,在C Next1中,6给出了从1到5的随机数

对你的问题空间来说,一个有用的助手是一个无限的掷骰子序列:


请注意,使用序列运算符可以避免完全执行循环和范围。当然,Take和Skip中有循环,但这是他们的事。您不需要循环来污染代码。使您的代码看起来像它正在编码的操作:掷一些骰子,丢弃一些骰子,对它们求和。

另一种方法是使用通用列表ForEach方法,如下所示,我还加入了变量,因为这被视为良好实践:

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

另一种方法是使用Generic List ForEach方法,如下所示,我还加入了变量,因为这被视为良好实践:

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

这很有趣,我想我以前试过这个,现在仍然得到相同的答案。非常感谢你。我想知道,当我将一个GUI合并到这个应用程序中来分配统计数据时,这会有多困难,但那是另一天!这很有趣,我想我以前试过这个,现在仍然得到相同的答案。非常感谢你。我想知道,当我将一个GUI合并到这个应用程序中来分配统计数据时,这会有多困难,但那是另一天!这真是太棒了!我要看看这个,谢谢你的投入!这真是太棒了!我要看看这个,谢谢你的投入!我正在考虑使用foreach,我不知道我实际上可以只使用列表中的foreach!这说明到目前为止我知道的很少,但这是一个很大的帮助!很高兴它有用。请注意,尽管您不能在rolls.ForEach方法中更改列表中的值,或者通过使用foreachvar roll-in-rolls方法来更改列表中的值,但您必须使用for;这一切都与不可变枚举数有关,这是您在foreach中实际处理的内容。我想我会指出这一点,因为在学习时这有点“抓到”了:我正在考虑使用foreach,我不知道我实际上可以只使用列表上的foreach!这说明到目前为止我知道的很少,但这是一个很大的帮助!很高兴它有用。请注意,尽管您不能在rolls.ForEach方法中更改列表中的值,或者通过使用foreachvar roll-in-rolls方法来更改列表中的值,但您必须使用for;这一切都与不可变枚举数有关,这是您在foreach中实际处理的内容。我想我应该指出这一点,因为在学习的时候有点“抓到了”: