개발 관련/SW, App 관련

겹치지 않는 난수 뽑기

by 소서리스25 2023. 4. 24.
반응형

겹치지 않는 난수 뽑기

 

개발을 하다보면 가끔 겹치지 않는 난수가 필요한 상황이 발생한다.

여러가지 방법?이 있겠지만...

현재 사용하고 있는 방법은 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static T[] ShuffleArray<T>(T[] array, int seed)
{        
    System.Random prng = new System.Random (seed);
 
    for (int i = 0; i < array.Length-1; i++
    {
        int randomIndex = prng.Next (i, array.Length);
 
        T tempItem = array [randomIndex];
        array [randomIndex] = array [i];
        array [i] = tempItem;
    }
 
    return array;
}
cs

 

결과는 seed 값에 따라 등록된 숫자나 문자를 겹치지 않게 잘 섞어준다.

아래와 같은 섞은 데이터를 확인 할 수 있다.

숫자 또는 문자를 잘 섞어준다
숫자 또는 문자를 겹치지 않게 잘 섞어준다

 

위의 결과를 얻는 전체 코드는 다음과 같으며 좀더 쉽게 결과를 확인 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ShuffleData : MonoBehaviour
{
 
    string[] rndChar = {"A""B""C""D""E""F""G" };
    int[] rndNum = { 1234567 };
 
    void Start()
    {
        foreach(var x in ShuffleArray(rndNum, 1))
        {
            print(x);
        }
    }
 
    public static T[] ShuffleArray<T>(T[] array, int seed)
    {
        System.Random prng = new System.Random(seed);
 
        for (int i = 0; i < array.Length - 1; i++)
        {
            int randomIndex = prng.Next(i, array.Length);
 
            T tempItem = array[randomIndex];
            array[randomIndex] = array[i];
            array[i] = tempItem;
        }
 
        return array;
    }
}
cs

 

예전에는 프로그램을 잘 모를때.. 지금도 그렇지만.. 아주 초보적인 방법을 썼었다.

if문으로 겹치지 않을때까지 반복했으니 그만큼 비효율적이었던 적이 있었다.

지금도 가끔 잘 모르니까 어떻게든 해결하고자 방법을 찾아보면 무식한 방법으로 밖에 할 수 없는 경우가 종종 생긴다.

 

반응형

댓글