복붙노트

[PYTHON] random.random ()이 사용하는 시드를 쿼리하는 방법?

PYTHON

random.random ()이 사용하는 시드를 쿼리하는 방법?

파이썬이 난수 생성기를 시드하는 데 사용한 시드를 찾는 방법이 있습니까?

나는 내 자신의 씨앗을 지정할 수 있다는 것을 알고 있지만 파이썬을 관리하는 것에 만족합니다. 그러나 어떤 씨앗을 사용했는지 알고 싶기 때문에 특정 실행에 들어간 결과가 마음에 들면 나중에 실행할 수 있습니다. 내가 사용 된 씨앗을 가지고 있다면 나는 할 수 있었다.

대답이 '할 수 없다'면, 씨앗을 직접 생성하는 가장 좋은 방법은 무엇입니까? 항상 달리기를 원합니다. 사용 된 것이 무엇인지 알고 싶습니다.

업데이트 : 예, random.random ()을 의미합니다! 실수 ... [제목 업데이트]

해결법

  1. ==============================

    1.발전기에서 자동 시드를 회수하는 것은 불가능합니다. 나는 보통 다음과 같은 씨앗을 생성한다 :

    발전기에서 자동 시드를 회수하는 것은 불가능합니다. 나는 보통 다음과 같은 씨앗을 생성한다 :

    seed = random.randrange(sys.maxsize)
    rng = random.Random(seed)
    print("Seed was:", seed)
    

    이 방법은 시간 기반이기 때문에 스크립트를 실행할 때마다 (수동으로) 달라 지지만 여러 발전기를 사용하는 경우 거의 동시에 생성 되었기 때문에 동일한 시드가 필요하지 않습니다.

  2. ==============================

    2.난수 생성기의 상태가 항상 단순히 시드가되는 것은 아닙니다. 예를 들어, 안전한 PRNG는 전형적으로 더 큰 데이터 블록 인 엔트로피 버퍼를 갖는다.

    난수 생성기의 상태가 항상 단순히 시드가되는 것은 아닙니다. 예를 들어, 안전한 PRNG는 전형적으로 더 큰 데이터 블록 인 엔트로피 버퍼를 갖는다.

    그러나 난수 생성기의 전체 상태를 저장하고 복원 할 수 있으므로 나중에 결과를 재현 할 수 있습니다.

    import random
    
    old_state = random.getstate()
    print random.random()
    
    random.setstate(old_state)
    print random.random()
    
    # You can also restore the state into your own instance of the PRNG, to avoid
    # thread-safety issues from using the default, global instance.
    prng = random.Random()
    prng.setstate(old_state)
    print prng.random()
    

    물론 getstate의 결과는 영구히 저장하려는 경우 제거 할 수 있습니다.

    http://docs.python.org/library/random.html#random.getstate

  3. ==============================

    3.random () 메소드를 파이썬이 (이 예제에서는 v3.5)하는 것과 같은 방법으로 다시 작성하지만, super ()를 호출하기 전에 시드 값을 변수에 저장하면된다.

    random () 메소드를 파이썬이 (이 예제에서는 v3.5)하는 것과 같은 방법으로 다시 작성하지만, super ()를 호출하기 전에 시드 값을 변수에 저장하면된다.

        import random
    
        class Random(random.Random):
            def seed(self, a=None, version=2):
                from os import urandom as _urandom
                from hashlib import sha512 as _sha512
                if a is None:
                    try:
                        # Seed with enough bytes to span the 19937 bit
                        # state space for the Mersenne Twister
                        a = int.from_bytes(_urandom(2500), 'big')
                    except NotImplementedError:
                        import time
                        a = int(time.time() * 256) # use fractional seconds
    
                if version == 2:
                    if isinstance(a, (str, bytes, bytearray)):
                        if isinstance(a, str):
                            a = a.encode()
                        a += _sha512(a).digest()
                        a = int.from_bytes(a, 'big')
    
                self._current_seed = a
                super().seed(a)
    
            def get_seed(self):
                return self._current_seed
    

    테스트하면 새 시드로 생성 된 첫 번째 무작위 값과 동일한 시드 (생성 된 get_seed () 메서드 사용)를 사용하여 생성 된 두 번째 값은 동일합니다.

        >>> rnd1 = Random()
        >>> seed = rnd1.get_seed()
        >>> v1 = rnd1.randint(1, 0x260)
        >>> rnd2 = Random(seed)
        >>> v2 = rnd2.randint(1, 0x260)
        >>> v1 == v2
        True
    

    거대한 시드 값을 저장 / 복사하고 다른 세션에서이 값을 사용하려고하면 생성 된 값은 완전히 동일합니다.

  4. ==============================

    4.random.seed (없음)를 사용하여 시드를 "설정"하면 랜더 마이저가 시스템 시간의 함수로 자동으로 시드됩니다. 그러나 관찰 한대로이 값에 액세스 할 수 없습니다. 난 무작위로 분류하고 싶지만 아직도 씨앗이 뭔지 알면 어떻게해야합니까?

    random.seed (없음)를 사용하여 시드를 "설정"하면 랜더 마이저가 시스템 시간의 함수로 자동으로 시드됩니다. 그러나 관찰 한대로이 값에 액세스 할 수 없습니다. 난 무작위로 분류하고 싶지만 아직도 씨앗이 뭔지 알면 어떻게해야합니까?

    tim = datetime.datetime.now()
    randseed = tim.hour*10000+tim.minute*100+tim.second
    random.seed(randseed)
    

    참고 : @Abdallah가 제안한 time.time ()을 사용하는 것을 선호하는 이유는이 방법은 사람이 읽을 수 있고 즉각적으로 이해할 수 있기 때문에 큰 이점이 있습니다. 필요에 따라 날짜 구성 요소 및 미세 세그먼트까지 추가 할 수 있습니다.

  5. ==============================

    5.시드는 다음 임의의 숫자를 만드는 데 사용되는 임의 패키지의 내부 변수입니다. 새 번호가 요청되면 시드도 업데이트됩니다.

    시드는 다음 임의의 숫자를 만드는 데 사용되는 임의 패키지의 내부 변수입니다. 새 번호가 요청되면 시드도 업데이트됩니다.

    매번 같은 난수가 있는지 확인하고 싶을 때 seed를 0으로 사용하는 것이 간단합니다.

    CorelDraw에는 한 번 시드가있는 임의 패턴 생성기가 있습니다. 패턴은 다른 씨앗에 따라 크게 달라 지므로 씨앗은 패턴의 중요한 구성 정보였습니다. 실행을위한 설정 옵션의 일부 여야합니다.

    편집 : 난수 생성기의 내부 상태는 해당 구현에 따라 시드보다 복잡 할 수 있습니다.

  6. ==============================

    6.나는 똑같은 일을하고 싶었지만 나는 그 씨앗을 얻을 수 없었다. 그래서 씨앗은 시간에서 생성 되었기 때문에 나는 생각했다. 나는 시스템 시간을 사용하여 내 씨앗을 만들고 그것을 씨앗으로 사용 했으므로 이제 어떤 씨앗을 사용했는지 알았습니다.

    나는 똑같은 일을하고 싶었지만 나는 그 씨앗을 얻을 수 없었다. 그래서 씨앗은 시간에서 생성 되었기 때문에 나는 생각했다. 나는 시스템 시간을 사용하여 내 씨앗을 만들고 그것을 씨앗으로 사용 했으므로 이제 어떤 씨앗을 사용했는지 알았습니다.

    SEED = int(time.time())
    random.seed(SEED)
    
  7. ==============================

    7.아무도 당신이 어떤 프로그래밍 언어로 얻을 수있는 가장 무작위 샘플이 운영 체제를 통해 생성된다고 언급 한 이후로 다음 코드를 제공해야합니다.

    아무도 당신이 어떤 프로그래밍 언어로 얻을 수있는 가장 무작위 샘플이 운영 체제를 통해 생성된다고 언급 한 이후로 다음 코드를 제공해야합니다.

    random_data = os.urandom(8)
    seed = int.from_bytes(random_data, byteorder="big")
    

    이것은 암호로 안전합니다.

    출처 : https://www.quora.com/What-is-the-best-way-to-generate-random-seeds-in-python

    값 8은 sys.maxsize와 같은 자릿수를 생성합니다.

    >>> int.from_bytes(os.urandom(8), byteorder="big")
    17520563261454622261
    >>> sys.maxsize
    9223372036854775807
    >>>
    
  8. from https://stackoverflow.com/questions/5012560/how-to-query-seed-used-by-random-random by cc-by-sa and MIT license