首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java -以相同的概率抽出数字

Java -以相同的概率抽出数字
EN

Stack Overflow用户
提问于 2016-03-24 04:16:19
回答 1查看 127关注 0票数 0

我正在尝试做一个统计模拟器,首先,我想画一个从0到2的数字,每个数字都有相同的被抽取的几率(即0= 33.33%,1= 33.33%和2= 33.33%),但是当我运行我的代码(对于一百万次抽取)时,我总是得到0被抽取33%,1被抽取66%,c被抽取1%的情况。

对于一百万次抽奖,我预计(有一些差异)每一个数字都接近33%。

这是我从代码中得到的:

代码语言:javascript
运行
复制
    Random number = new Random();
    int sorteio;
    int a=0;
    int b=0;
    int c=0;
    int n;


    for (n=0;n<1000000;n++){
    sorteio = number.nextInt(3);

    switch (sorteio){
    case 0:
        a++;
    case 1:
        b++;
    case 2:
        c++;
    }

}
    System.out.println("a: " + a + " b: " + b + " c: " + c);
EN

回答 1

Stack Overflow用户

发布于 2016-03-24 04:23:12

您的switch语句需要break语句来防止失败。

发生的情况是,如果生成0,则a递增,然后由于没有break语句,执行“失败”到下一个case,其中b递增,最后执行再次失败,c递增。

出于同样的原因,如果生成1,则bc都会递增。如果生成2,则仅递增c。因此,对于bc将以100%的速度递增,对于b,它将以66%的速度递增,对于c,它将以33%的速度递增(因为只有在生成1的时候才会递增)。

有关切换语句在Java语言中如何工作的更多信息,请查看this tutorial

试试这个:

代码语言:javascript
运行
复制
switch (sorteio) {
    case 0:
        a++;
        break;
    case 1:
        b++;
        break;
    case 2:
        c++;
        break;
}

如果您打算在switch中执行的所有操作都是递增int,那么使用数组可能更好:

代码语言:javascript
运行
复制
int[] count = new int[3];
for(int i=0; i<1000000; ++i) {
    count[number.nextInt(3)]++;
}

System.out.printf("a: %d, b: %d, c: %d%n", count[0], count[1], count[2]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36187901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档