在 C# 中,如何在数组中存储随机数等于某些总和的次数?

Posted

技术标签:

【中文标题】在 C# 中,如何在数组中存储随机数等于某些总和的次数?【英文标题】:In C#, how do I store the amount of times random numbers equal certain sums in an array? 【发布时间】:2020-08-06 00:52:59 【问题描述】:

我正在编写一个程序,可以按照用户的指定掷 _ 数量的 _ 面骰子 _ 次。这是一个具有特定要求的项目,例如类结构以及我必须使用 array 来显示我的结果的事实。结果应该显示我可能获得的每个总数以及滚动指定次数后获得每个总数的次数。

我已经写了我的尝试并且完全期望它能够工作,但当然它没有。 滚动 1000 次并滚动 2 个 6 面的骰子,这是我的结果:

4) 4
6) 4
8) 4
10) 4
12) 4

我希望是这样的:

2) 85
3) 83
4) 84
5) 82
... until 12

总和不是从 2 开始,而是从 4 开始,它滚动了 20 次而不是 1,000 次,并且所有值都相同。知道有什么问题吗?

这是我的代码:

    private int[] myTotals;
    private int possibleTotal = 2;
    private int arrayLocation = 0;
    private int myNumberOfDice;
    private string results = "";
    private static Random diceGenerator = new Random();

    public DiceFactory()
    

    

    public void rollDice(int numberOfRolls, int numberOfSides, int numberOfDice)
    
        myNumberOfDice = numberOfDice;

        myTotals = new int[numberOfRolls];

        arrayLocation = possibleTotal - 2;

        for (int i = 0; i < numberOfRolls; i++) 
            myTotals[arrayLocation] = diceGenerator.Next(1, numberOfSides + 1);
            myTotals[arrayLocation]++;
        

        while (possibleTotal <= numberOfSides * myNumberOfDice)
        
            results += (possibleTotal) + ") " + myTotals[arrayLocation] + "\r\n";
            possibleTotal++;
        
    

    public string getResults()
    

        return results;
    


【问题讨论】:

请向您最喜欢的rubber duck 大声朗读代码,看看它是否有意义(myTotals[arrayLocation] 的用法非常混乱)。还有一些关于为什么possibleTotal += 2; 会有所帮助的澄清......总体而言,edit 与真正的minimal reproducible example 的问题 - 包括数组的预期值以及如何调用该方法 - 会有所帮助。还要澄清为什么在没有显示真正的面向对象代码时标记为“OOP”的帖子......到目前为止,这个问题不太可能帮助未来的访问者...... 你也试过调试你的代码吗?遍历每一行并考虑您希望该行之前和之后的所有值是什么有很大帮助:docs.microsoft.com/en-us/visualstudio/debugger/… @AlexeiLevenkov 我添加了一个我期望结果的示例,感谢您的建议。 possibleTotal += 2; 是因为这以 2 秒为单位。现在这几乎是一个占位符,因为它假设你有 2 个骰子。我标记了 OOP,因为这是我们正在学习面向对象编程的课程的作业,并且程序中还有其他课程用于用户界面和面向对象的东西。我想我真的不需要这个标签。 在掷 2 个 6 面的骰子时,为什么您认为 不是 可能的总数?您还意识到您的 arrayLocation始终存在并保持 = 0 ? @Fildor 哦,你说得对,我只是用力捂脸。我在想它必须在 2 上 start 的事实。我想这是一个大问题,哈哈。为什么我的 arrayLocation 会从 0 开始? 【参考方案1】:

arrayLocation 在您的方法开始时被设置为 4 (6 - 2),并且在您通过滚动循环或结果构建循环时不会改变。这就解释了为什么您会看到所有输出的值 4

我建议为您的结果构建循环使用简单的 for 循环:

for (int i = 2; i <= numberOfSides * myNumberOfDice; i++)

    results += (i) + ") " + myTotals[i] + "\r\n";

这不是您唯一的问题。您需要弄清楚如何将滚动多个骰子的结果相加。 (您的代码当前没有在滚动循环中使用 myNumberOfDice。)一定要学习使用调试器并了解您认为在每个步骤中每个变量应该是什么,并进行比较以及实际显示的每一步。将复杂的事物分解成小的、可验证的步骤是软件开发的本质。

【讨论】:

"arrayLocation 在您的方法开始时被设置为 4 (6 - 2)" 你确定吗? possibleTotal 初始化为 2,所以是 2-2 = 0 ... 啊,是的,你是对的。 4 只是来自随机生成,加上一个由于++。 xkcd.com/221

以上是关于在 C# 中,如何在数组中存储随机数等于某些总和的次数?的主要内容,如果未能解决你的问题,请参考以下文章

C#:如何找到函数内数组的总和?

如何产生随机数,使它们的总和等于给定的数字?

如何在c#中分别存储字符串数组的组成部分

C#中,如何让一个变量值不等于指定的两个值

检查数组中两个不同数字的总和是不是等于变量数?

如何在 C# 数组字符串中选择 5 位随机数? [复制]