1. random的随机行为

Math.random中的随机数 为伪随机数 产生一个 [0,1) 浮点型数

并且每个数产生的概率 为等概率 生成的数字是均匀的,也就是说该区间内部的每个数字生成的几率是相同的

  1. int sum = 0;
  2. for (int i = 0; i <= 100000; i++) {
  3. double ans = Math.random();
  4. if(ans < 0.3) {
  5. sum++;
  6. }
  7. }
  8. //产生 100000 次 [0,1)的随机数 如果小于0.3则计数
  9. //查询小于0.3出现的概率 为30%左右 所以我们可以判断MJath.random的随机行为为等概率的
  10. System.out.println((double)sum /100000.0 );

2. 给定一个1~5等概率随机的函数 返回一个7~15等概率的新函数

首先1~5是等概率的 我们需要将此函数改为为只返回 0 和 1 的等概率函数

即如果给定的随机函数返回结果为3则重新生成随机数 直到生成不为3的结果 这样我们就可以获得一个 0 ~ 1 等概率随机生成的函数

7 ~ 15 为9个数 则对应的二进制为 1 0 1 需要3个二进制位 我们需要调用3次改造后的 0~1等概率发生器

第一次结果左位移2位 第二次结果左位移1位 第三次结果不位移, 最后将3次结果相加,这样我们获得0~13的等概率函数, 并且我们进行截取 超过9的数重新调用 0~13等概率函数

  1. do{
  2. int ans = f4();//0~13等概率函数
  3. }while(ans > 9);
  4. return ans;

这样我们获得一个0~9的等概率发生器 最后调用0~9等概率发生器 + 7则完成此新函数

3. 给定一个0~1不等概率的随机函数 返回0~1等概率随机函数

首先0~1是不等概率 我们通过调用两次此函数

0 0 概率则为 p*p

1 1 概率则为 (1-p)*(1-p)

0 1 概率为 p*(1-p)

1 0 概率为 (1-p)*p

通过筛选 01 和 10 结果即可以返回一个等概率的函数

01则返回0

10则返回1

  1. // 给定一个 0和1不等概率的函数
  2. public static int x() {
  3. return Math.random() < 0.8 ? 0 : 1;
  4. }
  5. // 返回一个等概率0和1的新函数
  6. public static int x2() {
  7. int ans = 0;
  8. do {
  9. ans = x();
  10. } while (ans == x()); //如果两次都结果为0或1则重新调用x函数
  11. //只有 ans = 0 x()返回1
  12. //和 ans = 1 x()返回0 才返回ans
  13. return ans;
  14. }