Just do it
专注做自己的事,有想做的事就去做好了

题目解析

  1. 首先需要将fx函数转化为一个0,1的等概率的心函数
  2. 对要转换的函数的范围分析
  3. 通过0,1等概率函数利用二进制规则转换为所需的函数
// 制作1-5上的随机函数
public static int fx() {  
    return (int) (Math.random() * 5) + 1;  
}

第一步:将fx函数转化为一个0,1的等概率的心函数

// 将fn转换为0,1等概率随机函数  
public static int fn2() {  
    int fn = fn();  
    while (fn == 2) {  
        fn = fn();  
    }  
    return fn < 3 ? 0 : 1;  
}

第二步:对要转换的函数的范围分析

1~7等概率,观察我们制作随机函数,我们也可以先做一个0~6的等概率函数,然后再加一即可得到1~7的等概率函数
第三步:通过0,1等概率函数利用二进制规则转换为所需的函数
这里要做的内容就变为“如何通过等概率发射器生成二进制0~6等概率函数”。
二进制想要表达0~6之间的所有数最小需要四位。只需要连续roll4次等概率发射器即可生成从0~8的随机数,且每次得到的最终结果是等概率的。
但是我们不需要除了0~6以外的数值,所以如果大于6就再从头来一次,直到在范围以内在停止。

public static int fn3() {  
    int a = 0;  
    do {  
        String result = "";  
        for (int i = 0; i < 4; i++) {  
            result += fn2();  
        }  
        a = Integer.parseInt(result, 2);  
    }while (a > 6);  
    return a + 1;  
}
posted on 2025-09-26 20:04  Ireck  阅读(6)  评论(0)    收藏  举报