Shuffle Bags 는 랜 덤 이 그렇게 랜 덤 하지 않 게 해 줍 니 다.

3079 단어 algorithm
머리말
내 가 처음에 게임 을 썼 을 때,나 는 표준 Random()함 수 를 자주 사용 한 후에 if 와 else 조건 을 한 무더기 써 서 내 가 예상 한 결 과 를 얻 었 다.만약 결과 가 그다지 좋 지 않다 면,나 는 게임 이 재미 있어 질 때 까지 더 많은 조건 을 써 서 여과 하거나 선별 할 것 이다.최근 에 나 는 더 좋 은 방법 이 있다 는 것 을 발견 했다.내 장 된 Random 클래스 는 문제 가 없습니다.문 제 는 내 장 된 Random 클래스 를 사용 하면 우리 가 기대 하 는 효 과 를 얻 기 어렵 다 는 것 입 니 다.
실제로 동전 을 던 지 는 것 을 예 로 들 면 여러 번 꽃 이나 글 자 를 던 지기 도 한다.그렇다면 게임 에서 여러 차례 의 연속 적 인 폭격 이나 경직 으로 나타 날 수 있다.때로는 폭격 과 경직 의 확률 이 낮 지만 연속 적 으로 나타 날 수 있어 이상 하 다.그렇다면 비슷 한 문 제 를 해결 하기 위해 선배 들 은 특수 치 여과 등 여러 가지 방법 을 생각 했다.우리 가 오늘 소개 한 것 은 Shuffle Bag 기술 입 니 다.당신 의 무 작위 수 를 무 작위 로 하지 않 고 당신 이 통제 할 수 있 습 니 다.
셔 플 백 이란 무엇 일 까요?
Shuffle Bag 은 우리 가 난수 분 포 를 제어 할 수 있 는 기술 이다.
그 주요 원 리 는:
특정 분포 수치의 집합 을 설계 하 다
집합 중의 수 치 를 가방 에 옮 겨 라
  • 가방 의 수 치 를 무 작위 로 흐 트 러 뜨 립 니 다.
  • 가방 에서 임의의 순서(가 고 나 면 뒤에서 앞으로 가도 상관 없어)로 하나씩 추출 수 치 를 추출 하고 가방 이 비어 있 을 때 까지 다시 놓 지 않 습 니 다

  • 4.567917.가방 이 비어 있 으 면 데 이 터 를 다시 놓 고 다시 어 지 럽 힌 다음 에 재 활용 합 니 다
    Shuffle Bag 의 특성 은 다음 과 같 습 니 다.
    4.567917.집합 이외 의 데 이 터 는 발생 하지 않 습 니 다
    4.567917.이것 은 아직도 임 의 성 을 가지 고 요소 가 나타 나 는 순 서 는 임 의 이다
    4.567917.중복 추출 이 아니 라 데이터 가 특정한 요 소 를 집중 시 키 면 기껏해야 두 번 연속 으로 나타난다
    어떻게 셔 플 백 을 실현 합 니까?
    원문 은 C\#를 사용 하고 여 기 는 Unity C\#와 범 형 을 사용 하여 다른 언어 로 쉽게 번역 할 수 있 습 니 다.실현 은 먼저 전체 가방 을 랜 덤 으로 흐 트 러 뜨리 는 것 이 아니 라 매번 추출 할 때 만 랜 덤 교환 을 한다.이렇게 하면 성능 을 분담 할 수 있 고 가방 데이터 가 비교적 많 을 때 가방 을 어 지 럽 히 면 특정한 프레임 의 과도 한 성능 을 소모 하지 않 는 다.
    using System.Collections.Generic;
    
    using UnityEngine;
    
    public class ShuffleBag {
    
        
        private List data;
        private T currentItem;
        private int currentPosition = -1;
    
        private int Capacity { get { return data.Capacity; } }
        public int Size { get { return data.Count; } }
    
        public ShuffleBag(int initCapacity)
        {
            data = new List(initCapacity);
        }
    
        public void Add(T item, int amount)
        {
            for (int i = 0; i < amount; i++)
                data.Add(item);
    
            currentPosition = Size - 1;
        }
    
        public T Next()
        {
            if (currentPosition < 1)
            {
                currentPosition = Size - 1;
                currentItem = data[0];
    
                return currentItem;
            }
    
            var pos = Random.Range(0,currentPosition);
            currentItem = data[pos];
            data[pos] = data[currentPosition];
            data[currentPosition] = currentItem;
            currentPosition--;
    
            return currentItem;
        }
    }

    Shuffle Bag 는 어떻게 사용 합 니까?
    제 프로젝트 에서 저 는 NPC 가 다 친 애니메이션 을 재생 할 확률 이 10 분 의 1 이 기 를 바 랍 니 다.그리고 저 는 그 가 가끔 다 친 애니메이션 을 여러 번 연속 으로 재생 하 는 것 을 보고 싶 지 않 고 다 친 애니메이션 을 오래 재생 하지 않 고 싶 지 않 습 니 다.
      ShuffleBag hurtBag = new ShuffleBag(10);
      hurtBag.Add(false, 9);
      hurtBag.Add(true, 1);
    //      ,        
        if(hurtBag.Next())
        {
          Play();
        }

    부록
    참고 원문 링크 를 첨부 하 다 Shuffle Bags: Making Random() Feel More Random  영 어 를 잘 하 는 학생 은 직접 원문 을 볼 수 있다.그리고 이 원문의 제목 이 좀 의 심 스 러 워 서 제 번역문 제목 이 바 뀌 었 습 니 다.

    좋은 웹페이지 즐겨찾기