繁体   English   中英

n边滚动m模x次

[英]Rolling m die with n sides x times

好的,所以我更改了代码,并删除了其中很多不必要的垃圾。 它适用于某些数字,但不适用于其他数字,例如,当我放入100卷/ 8面/ 3模时,尽管我为此设置了限制,但仍给我带来了超出范围的错误。 显然,我已经查看了一些细节,但是我不确定它是什么细节。

public class Ass11f {

    public static void main(String[] args) {
        EasyReader console = new EasyReader();
        System.out.print("Enter how many times you want to roll the die: "); 
        int numRolls = console.readInt();
        System.out.print("Enter the amount of sides: ");
        int numSides = console.readInt();           
        System.out.print("Enter the amount of die: ");
        int numDie = console.readInt();     
        int[] rollSum = new int[numDie*numSides];

        for (int i = 0; i<numRolls; ++i)
            {
            int rollCounter=0;
            for (int l = 0; l<numDie; ++l){
                rollCounter += ((int)(Math.random()*numSides)+1);
            }
            rollSum[rollCounter]++;
        }     
        for (int m = 2;m<=rollSum.length;++m) System.out.println(m+"'s: "+rollSum[m]+" times, "+((((double)rollSum[m])/numRolls)*100)+"%");                                                   
    }
}

有两个基本问题:

  1. 在添加总滚动数时,您尝试将最大滚动数添加到数组末尾的索引中。 简单的解决方法是将数组的长度简单地加1。
  2. 打印时,无法使用等于数组长度的索引访问数组,这是m<=rollSum.length最终将执行的操作。 将其替换为m < rollSum.length以使其在最终值之前停止。

另外,以下是一些使数组创建更加清晰的方法:

    // The minimum value is always numDie.
    // The maximum is always numDie * numSides
    // There are maximum - minimum + 1 possible values (ie 6 on a d6)
    int maximum = numDie * numSides;
    int minimum = numDie;

    // Remember, index zero is now the minimum roll. 
    // The final index is the maximum roll. So the count at an index is really
    // the count for any roll with value index + minimum
    int[] rollSum = new int[maximum - minimum + 1];

我还建议拆分该打印语句。 它更易于阅读和调试。 另外,您可以从numDie而不是2开始,以说明您的骰子死于或少于3:

    for (int i = numDie; i < rollSum.length; ++i) {
        // Print the first bit, ie "2's: ".
        System.out.print(i + "'s: ");

        // How many times was that value rolled?
        System.out.print(rollSum[i] + " times, ");

        // What percentage is that?
        double percentage = ((double)rollSum[i]) / numRolls * 100;
        System.out.println(percentage + "%");
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM