생 성 1 - 5 난수 함 수 를 1 - 7 난수 함수 로 변환 하 는 실현 방법

3889 단어
개인 기술 블 로그 주소:http://songmingyao.com/
문제.
1 - 5 난수 생 성 함수 random5 (확률 평균), 이 를 생 성 1 - 7 난수 random 로 변환 하 는 방법7 의 함수 (확률 평균), random 모듈 사용 불가
사고방식 1 (거짓)
직접 random5 생 성 된 난수 곱 하기 7 / 5 후 round 함 수 를 통 해 반올림 후 출력
random_출력
random_출력
1
1
2
3
3
4
4
6
5
7
아주 나 쁜 생각..
사고방식 2 (거짓)
random 2 회 생 성5. 이들 의 값 을 더 한 후 1 random_5 + random_5 - 1 을 줄 이 고 난수 1 - 9 를 얻 은 다음 에 다시 판단 하여 8 과 9 를 제거 하고 1 - 7 로 돌아 갈 때 만 출력 한다.
하지만 곧 두 번 만 random5. 모두 1 을 되 돌 릴 때 만 1 을 되 돌려 주 고 확률 은 다른 6 개 수 를 되 돌려 주 는 것 보다 훨씬 적다.
또 나 쁜 생각 이 군..
사고방식 3 (True)
  • 이전의 두 가지 사고방식 을 통 해 random5. 돌아 온 데 이 터 는 여러 가지 처 리 를 거 친 후에 선별 하지 않 고 1 - 7 로 돌아 가 는 것 은 실현 할 수 없다 (불가능 하 다 고 말 할 수 없다. 다만 나의 개인 능력 이 유한 하고 아직 방법 을 생각해 내지 못 했다). 그러면 반드시 사고 2 중의 선별 방법 을 사용 해 야 한다.
  • 선별 방법 을 사용 하 겠 다 고 확정 한 후에 목 표 는 생 성 등 확률 이 되 고 수치 추출 범 위 는 1 - 7 의 임 의 수 보다 크다.
  • 값 계 수 를 더 하고 되 돌려 주 는 방법 을 모두 시 도 했 으 니 두 가 지 를 결합 시 킬 수 있 을 까?
  • 우선 곱셈 계 수 를 생각해 보 자. random_5 * 2 - 1 의 반환 결 과 는 [1, 3, 5, 7, 9] 이 고 확률 을 기 다 려 1 - 10 을 생 성 하려 면 이 반환 값 에 무 작위 로 생 성 된 0 과 1, 즉 random.randint(0, 1)
  • 이다.
  • random 모듈 을 사용 할 수 없 기 때문에 기 존의 random 을 반복 적 으로 이용 할 방법 을 강구 해 야 합 니 다.5 함수, random_5 * 3 - 2 대응 해 야 하 는 random.randint(0, 2)random.randint(1, 3) - 1
  • 로 이해 할 수 있다.
  • 이때 분명 하 다. random_5 * 5 - 4 대응 해 야 할 random.randint(1, 5) - 1, 즉 random_5 - 1 그러면 기본 적 인 함수 체 가 나온다. 바로
  • random_5 * 5 + random_5 - 5
    
  • 선별 한 논 리 를 추가 하면 전체 코드 는 다음 과 같다.
  • import random
    
    
    #     1-5      
    def random_5():
        return random.randint(1, 5)
    
    
    #       1~7      
    def random_7():
        while True:  #        
            n = (random_5()-1)*5 + random_5()-1  #   0~24    
            if n <= 20:
                return n % 7 + 1
    
    
    if __name__ == '__main__':
        print(random_7())
    

    진급 하 다
    방금 나 온 핵심 코드 는 상 변 수 를 제거 한 후에 random_5 * 5 + random_5 가 되 었 다. 마치 2, 8, 16 진법 이 10 진법 으로 전환 하 는 방법 처럼 보인다. 즉, 5 진법 으로 이해 할 수 있다. 이런 사상 을 통 해 우 리 는 통용 되 는 난수 전환 방법 을 얻 을 수 있다. 구체 적 인 코드 는 다음 과 같다.
    import random
    import math
    
    
    class RandomIJToRandomAB(object):
        """   i-j          ,   a-b          """
        def __init__(self, i, j):
            self.i = i
            self.j = j
            ij_dif = j-i
    
            if ij_dif <= 0:
                raise ValueError
    
            self.ij_dif = ij_dif
    
        def random_ij(self):
            return random.randint(0, self.ij_dif)
    
        def random_ab(self, a, b):
            ab_dif = b-a
            digit = int(math.ceil(math.log(ab_dif+1, self.ij_dif+1)))  #     (ab_dif)   ij_dif+1        
    
            while True:  #   return None
                #        digit ij_dif+1     ,     10  
                random_res = 0
                for item in range(digit):
                    random_res += self.random_ij() * pow(self.ij_dif+1, item)
    
                #             
                if random_res <= ab_dif:
                    return random_res+a
    
    
    if __name__ == '__main__':
        print('0~1         2~11      ')
        random_1 = RandomIJToRandomAB(0, 1)
        print(random_1.random_ab(2, 11))
        print('-'*50)
    
        print('1~5         1~7      ')
        random_1_5 = RandomIJToRandomAB(1, 5)
        print(random_1_5.random_ab(1, 7))
        print('-'*50)
    
        print('1~7         1~5      ')
        random_1_7 = RandomIJToRandomAB(1, 7)
        print(random_1_7.random_ab(1, 5))
        print('-'*50)
    

    Github 원본 주소:
    random5_to_random7: https://github.com/shelmingsong/algorithm_practice/blob/master/31_random5_to_random7_20170824.py
    random_ij_to_random_ab: https://github.com/shelmingsong/algorithm_practice/blob/master/32_random_ij_to_random_ab_20170824.py

    좋은 웹페이지 즐겨찾기