의사 난수 (pseudo-random)와 달리 “즐겁게”무작위를 생성하는 방법 그냥 예측할

여러 종류의 퍼즐을 순서대로 제시하는 게임을 만들고 있습니다. 나는 의사 난수로 각 퍼즐을 선택합니다. 각 퍼즐마다 여러 가지 변형이 있습니다. 다른 의사 난수로 변형을 선택합니다. 등등.

문제는 이것이 거의 임의의 확률을 생성하지만 플레이어가 실제로 원하는 것은 아닙니다. 플레이어는 일반적으로 자신이 인식하고 무작위로 식별하는 것을 원하지만 퍼즐을 반복하지 않는 경우에만 가능합니다. 따라서 무작위는 아닙니다. 그냥 예측할 수 없습니다.

생각을 해보면 해키 방법을 상상할 수 있습니다. 예를 들어, 새로운 선택을 선택할 때 일련의 가능성 중에서 가장 최근의 N 선택을 일시적으로 제거합니다. 또는 모든 선택에 동일한 확률을 할당하여 선택시 선택 확률을 0으로 줄인 다음 각 선택에 따라 모든 확률을 천천히 증가시킵니다.

이 작업을 수행하는 기존의 방법이 있다고 가정하지만 용어를 알지 못하므로 찾을 수 없습니다. 누구 알아? 아니면 누군가가 이것을 즐거운 방법으로 해결 했습니까?



답변

한정된 수의 퍼즐이있는 경우 다음을 수행 할 수 있습니다.

  • 퍼즐 목록 전체를 구성하거나 임의로 선택한 퍼즐 목록을 작성하십시오.
  • 이 목록을 섞으십시오 ( 예 : Knuth Shuffle 참조 ).
  • 플레이어가이 목록을 재생하도록하십시오.
  • 목록이 비어 있으면 새 목록으로 시작하십시오.

편집하다

나는 이것을 알지 못했지만 SE를 탐색하면 이것이 실제로 “셔플 백”으로 알려져 있음을 알게되었습니다. 좀 더 정보를 정기적으로 여기 , 여기있다 .

편집 2

고전적인 Knuth Shuffle은 다음과 같이 진행됩니다.

To shuffle an array a of n elements (indices 0..n-1):
    for i from n  1 down to 1 do
        j  random integer with 0  j  i
        exchange a[j] and a[i]

Steven Stadnicki는 자신의 의견에서 이런 종류의 일이 개편에 대한 반복을 막지 못한다고 정당하게 지적했습니다. 이것을 고려하는 방법은 마지막 항목에 특별한 경우를 추가하는 것입니다.

To reshuffle an array a of n elements and prevent repetitions (indices 0..n-1):
    return if n <= 2

    // Classic Knuth Shuffle for all items *except* the last one
    for i from n  2 down to 1 do
        j  random integer with 0  j  i
        exchange a[j] and a[i]

    // Special case for the last item
    // Exchange it with an item which is *not* the first one
    r  random integer with 1  r  n - 1
    exchange a[r] and a[n - 1]

답변

lorancou의 접근 방식에 대한 변형 : 각 퍼즐 유형에 대해 (셔플) 퍼즐 번호 배열을 유지하십시오. 그런 다음 해당 유형의 퍼즐을 칠 때마다 다음 숫자를 목록에서 가져옵니다. 예를 들어 스도쿠, 피 크로스 및 켄켄 퍼즐이 있으며 각각 퍼즐 # 1..6이 있다고 가정 해 봅시다. 각 퍼즐 유형에 대해 하나씩 숫자 1..6의 셔플 배열 3 개를 만듭니다.

  • 스도쿠 : [5, 6, 1, 3, 4, 2]
  • 파이 크로스 : [6, 2, 4, 1, 3, 5]
  • 켄켄 : [3, 2, 5, 6, 4, 1]

이제 lorancu가 제안한 것처럼 퍼즐 유형을 섞습니다. [Picross, Sudoku, Kenken]이 등장한다고 가정 해 보겠습니다. 그런 다음 주어진 유형의 퍼즐을 칠 때마다 ‘셔플 목록’에서 다음 숫자를 사용하십시오. 전체 퍼즐 프레젠테이션은 [Sudoku # 5, Picross # 6, Kenken # 3, Sudoku # 6, Picross # 2, Kenken # 2, …]입니다.

루프를 통해 매번 같은 전체 순서로 퍼즐을 유지하고 싶지 않다면 ‘마지막으로 몇 가지 선택을 무시하고 무작위로 선택하십시오’옵션이 가장 좋습니다. 이것도 조금 더 효율적으로 만들 수있는 방법이 있습니다. 예를 들어 20 가지 항목이 있고 마지막 5 가지 항목을 무시하고 싶다고 가정 해 봅시다. 그런 다음 무작위로 숫자 1..20을 선택하는 대신 마지막 5 이외의 숫자를 얻을 때까지 ‘재 롤링’하는 대신 숫자 1..15를 선택하고 많은 단계를 거치면서 퍼즐 유형을 건너 뜁니다. 선택되었습니다 (마지막으로 선택한 5 개의 퍼즐을 보유한 비트 배열을 유지하면이 작업을 쉽게 수행 할 수 있습니다).