Expand a random range from 1–5 to 1–7

前端 未结 30 2841
一个人的身影
一个人的身影 2020-11-22 07:29

Given a function which produces a random integer in the range 1 to 5, write a function which produces a random integer in the range 1 to 7.

  1. What is a simple so
30条回答
  •  臣服心动
    2020-11-22 08:18

    Algorithm:

    7 can be represented in a sequence of 3 bits

    Use rand(5) to randomly fill each bit with 0 or 1.
    For e.g: call rand(5) and

    if the result is 1 or 2, fill the bit with 0
    if the result is 4 or 5, fill the bit with 1
    if the result is 3 , then ignore and do it again (rejection)

    This way we can fill 3 bits randomly with 0/1 and thus get a number from 1-7.

    EDIT: This seems like the simplest and most efficient answer, so here's some code for it:

    public static int random_7() {
        int returnValue = 0;
        while (returnValue == 0) {
            for (int i = 1; i <= 3; i++) {
                returnValue = (returnValue << 1) + random_5_output_2();
            }
        }
        return returnValue;
    }
    
    private static int random_5_output_2() {
        while (true) {
            int flip = random_5();
    
            if (flip < 3) {
                return 0;
            }
            else if (flip > 3) {
                return 1;
            }
        }
    }
    

提交回复
热议问题