출처: https://github.com/AnnulusGames/LucidRandom/blob/main/README_JP.md
유니티용으로 만든 라이브러리로 https://github.com/AnnulusGames/LucidRandom/tree/main/Assets/LucidRandom/Runtime 에 있는 코드를 수정하면 보통의 닷넷코어 환경에서도 사용 가능하다.
개요
Lucid Random는 Unity의 Random 클래스를 확장하여 재현 가능한 난수나 가중치 있는 추첨 등 많은 기능을 추가했다.
특징
- UnityEngine.Random을 베이스로 많은 기능을 추가한 LucidRandom 클래스
- 최소값과 최대값을 다루는 구조체
- 가중치 있는 리스트를 다루는 WeightedList
셋업
중요
설치
- Window > Package Manager 에서 Package Manager을 연다
- 「+」버튼 > Add package from git URL
- 아래를 입력한다
혹은 Packages/manifest.json을 열고, dependencies 블럭에 아래를 추가
{
    "dependencies": {
        "com.annulusgames.lucid-random": "https://github.com/AnnulusGames/LucidRandom.git?path=/Assets/LucidRandom"
    }
}
Namespace
Lucid Random을 이용하는 경우는 파일 선두에 아래 1행을 추가한다.
using AnnulusGames.LucidTools.RandomKit;
기본적인 사용법
기본적으로는 Unity.Random 클래스와 같은 방법으로 사용할 수 있다.
| //0.0f 에서 10.0f 까지의 값을 랜덤하게 취득float value = LucidRandom.Range(0f, 10f);
 
 //랜덤한 색을 취득
 Color color = LucidRandom.ColorHSV();
 | 
시드 값을 설정하고 싶으면 InitState을 이용한다.
| int seed = (int)System.DateTime.Now.Ticks;//시드 값을 지정
 LucidRandom.InitState(seed);
 | 
랜덤한 bool 값을 얻고 싶은 경우는 valueBool을 이용한다
| //true 혹은 false를 랜덤하게 반환if (LucidRandom.valueBool)
 {
 Debug.Log("Hello!");
 }
 | 
또 Vector2 나 Vector3도 Range의 인수로 지정할 수 있다
| //(0, 0) 에서 (1, 1)까지의 랜덤함 Vector2를 반환Vector2 vector2 = LucidRandom.Range(Vector2.zero, Vector2.one);
 
 //(0, 0, 0) 에서 (1, 1, 1)까지의 랜덤함 Vector3을 반환
 Vector3 vector3 = LucidRandom.Range(Vector3.zero, Vector3.one);
 | 
onUnitCube 나 insideUnitSquare 등도 이용할 수 있다.
| //단위입방형의 표면 좌표를 랜덤하게 얻는다Vector3 p1 = LucidRandom.onUnitCube;
 
 //단위입방형 내부의 좌표를 랜덤하게 얻는다
 Vector2 p2 = LucidRandom.insideUnitSquare;
 | 
확률에 의한 게산을 하는 경우는 GetChance를 이용한다.
| //15% 확률로 true를 반환if (LucidRandom.GetChance(0.15f))
 {
 Debug.Log("Lucky!");
 }
 | 
주사위를 던지는 경우는 RollDice를 이용한다/
| //6면 다이스를 던질 때 나올 수 얻기int valueD6 = LucidRandom.RollDice(DiceType.D6);
 
 //10면 다이스를 2번 던질 때 나올 총합값 얻기
 int value2D10 = LucidRandom.RollDice(2, DiceType.D10);
 | 
배열이나 List의 랜덤한 요소를 얻고 싶은 경우는 RandomElement을 이용한다.
| int[] array = { 1, 2, 3, 4, 5, 6 };//배열의 랜던함 요소를 얻는다
 int a = LucidRandom.RandomElement(array);
 
 
 //가변 길이 인수에 의한 지정도 가능
 int b = LucidRandom.RandomElement(1, 2, 3, 4, 5, 6);
 | 
배열이나 리스트의 순번을 랜덤하게 교체하고 싶은 경우는 Shuffle을 이용한다/
| int[] array = { 1, 2, 3, 4, 5, 6 };//순번을 셔플
 array = LucidRandom.Shuffle(array).ToArray();
 | 
Gradient 중에서 랜덤한 색을 얻고 싶은 경우는RandomColor를 이용한다.
| Color color = LucidRandom.RandomColor(gradient); | 
확장 메소드
RandomElement, Shuffle, RandomColor는 각각 확장 메소드로 준비 되었다
//배열의 랜덤한 요소를 얻기
int[] array = { 1, 2, 3, 4, 5, 6 };
int a = array.RandomElement();
//순번을 셔플
array = array.Shuffle().ToArray();
//랜덤한 색을 얻기
Color color = gradient.RandomColor();
난수 재현
Unity의 Random 클래스는 인스턴스화 할 수 없으므로 재현 가능한 난수를 생성하는 것에 알맞지 않다. Lucid Random 에서는 RandomGenerator 클래스를 이용하여 난수의 재현을 간단하게 할 수 있다.
| int seed = 0;//인수로 시드 값을 지정한다
 RandomGenerator rand = new RandomGenerator(seed);
 
 //LucidRandom 클래스와 같은 메소드나 프로퍼티를 이용 가능
 float value1 = rand.value;
 float value2 = rand.value;
 float value3 = rand.value;
 | 
또는 AddGenerator・GetGenerator을 이용하여 RandomGenerator을 등록해둘 수 있다. 이것은 복수의 클래스로 같은 난수를 재 사용하고 싶을 때 편리하다.
| int seed = 0;//새로운 RandomGenerator를 등록
 LucidRandom.AddGenerator("Key", seed);
 
 //Key를 지정하여 RandomGenerator를 얻는다
 float value1 = LucidRandom.GetGenerator("Key").value;
 float value2 = LucidRandom.GetGenerator("Key").value;
 float value3 = LucidRandom.GetGenerator("Key").value;
 | 
MinMaxValue
Lucid Random에서는 최소값과 최대값을 다루는 구조체가 정의되어 있다.
| //0을 최소, 100을 최대로 하는 floatMinMaxFloat mmFloat = new MinMaxFloat(0f, 100f);
 
 //최소값을 얻는다
 float minValue = mmFloat.min;
 //최대값을 얻는다
 float minValue = mmFloat.max;
 //최소값~최대값을 범위로 하는 난수를 얻는다
 float randomValue = mmFloat.random;
 
 //값의 범위 길이를 얻는다(int, float 만)
 float length = mmFloat.length;
 
 //최소값~최대값의 Lerp를 이용 가능
 float value = mmFloat.Lerp(0.2f);
 | 
이것은 Range의 인수로서도 이용 가능하다.
| MinMaxFloat mmFloat = new MinMaxFloat(0f, 100f);
 //0.0f 에서 100.0f 까지의 값을 랜덤하게 얻는다
 float value = LucidRandom.Range(mmFloat);
 | 
또 이 값은 Inspector 상에서 편집 가능하다

대응하고 있는 타입은 아래와 같다.
- int
- float
- Vector2
- Vector2Int
- Vector3
- Vector3Int
WeightedList
게임 내에서 추첨을 하는 경우 일정 확률이 아닌 어느 정도 가중치가 붙은 추첨을 해야하는 경우가 있다. Lucid Random 에서는 WeightedList를 이용하여 가중치 붙은 추첨을 간단하게 구현할 수 있다.
WeightedList는 보통의 List 처름 이용할 수 있다.
| WeightedList<string> weightedList = new WeightedList<string>();
 //값을 추가
 weightedList.Add("Hello!");
 weightedList.Add("How are you?");
 
 //값을 편집
 weightedList[1].value = "I'm good.";
 
 //값을 삭제
 weightedList.Remove("Hello!");
 weightedList.RemoveAt(0);
 | 
요소에 가중치를 붙이고 싶은 경우는 요소를 추가할 때 지정하거나 요소가 가진 weight 값을 변경한다. 지정이 없는 경우 weight는 1로 설정된다.
| WeightedList<string> weightedList = new WeightedList<string>();
 //가중치가 있는 요소를 추가
 weightedList.Add("Legendary", 0.5f);
 weightedList.Add("Epic", 2.5f);
 weightedList.Add("Rare", 12f);
 weightedList.Add("Uncommon", 25f);
 weightedList.Add("Common", 60f);
 
 //가중치를 편집
 weightedList[4].weight = 50f;
 weightedList["Uncommon"] = 35f;
 
 //추첨을 한다
 string rarity = weightedList.RandomElement();
 | 
WeightedList는 추가된 요소를 WeightedListItem 으로 다룬다. WeightedListItem는 value와 weight 2개의 값을 가지고 있다.
| WeightedList<string> weightedList = new WeightedList<string>();
 WeightedListItem<string> item = new WeightedListItem<string>("Value", 10f);
 weightesList.Add(item);
 | 
또 WeightedList는 Inspector 상에서 편집 가능하다
