生成随机数,使得偶数的概率是奇数的两倍

4

我想知道是否有一种方法可以创建一个随机数生成器,它可以在两个整数之间生成一个数字,但是生成偶数的概率比生成奇数的概率高两倍。目前,我还没有找到类似或接近2倍概率的方法。


2
生成一个从0到2的随机数。如果是0或1,则生成一个偶数,如果是2,则生成一个奇数。 - Steve Kuo
我的代码依赖于用户创建范围。有什么解决方法吗? - nichilus
3个回答

4

简单但应该有效:

  • 存储随机浮点数调用(0.0f - 1.0f)(random.nextFloat()
  • 获取所需范围内的随机整数
  • 如果随机浮点数调用小于0.67f,如果需要将随机整数递减或递增使其变为偶数,则返回值
  • 否则,如果需要将随机整数递减或递增,使其成为奇数,则返回值

确保在随机整数是所需范围的边界值时,向正确方向递减或递增。


1
请注意:在范围的两个边界或其中一个处以不同方式操作,会扭曲这些边界处结果的分布。 - John Bollinger
1
你的解决方案将生成偶数相对于奇数1.97倍。 - Steve Kuo
@SteveKuo 这大概是我从问题中理解的比例。 - NESPowerGlove

1
有许多方法可以实现这一点。其中一种方法是生成两个整数:一个在用户的范围内,另一个在0到2之间(含)。将第一个数字的最后一位替换为第二个数字的最后一位,以获得偶数结果比奇数结果多两倍的结果。
您需要注意的是,位操作的最后一步可能会使结果超出范围;在这种情况下,您应该从头开始重新绘制。

0

在评论中实现@SteveKuo的建议:

import java.util.Scanner;

class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("Please enter the minimum number that can be generated: ");
    int min = scanner.nextInt();
    System.out.print("Please enter the maximum number that can be generated: ");
    int max = scanner.nextInt();
    int evenOrOdd = 0 + (int)(Math.random() * ((2 - 0) + 1));
    int random = 0;
    if(evenOrOdd == 2) { // generate random odd number
      if(max % 2 == 0) { --max; }
      if(min % 2 == 0) { ++min; }
      random = min + 2*(int)(Math.random() * ((max - min)/2+1));
    } else { //get random number between [(min+1)/2, max/2] and multiply by 2 to get random even number between min and max
      random = ((min+1)/2 + (int)(Math.random() * ((max/2 - (min+1)/2) + 1))) * 2;
    }
    System.out.printf("The generated random number is: %d", random);
  }
}

在这里尝试一下!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接