• [작업] 2018.05.03 AM 11:07

게시물 주소 FONT글자 작게하기 글자 키우기

 

 

1,

void example(){

int[] p = new int[]{ 1, 2, 3, 4, 5, 6};


for (int i = 0; i < p.Length; i++) {

int rand = Random.Range (i, p.Length);

int temp = p [rand];

p [rand] = p [i];

p [i] = temp;


print (p [i]);

}

}

 

구문을 설명하기전에 먼저 작동원리부터 이해하는게 도움이 될 것이다.

지금까지 난수를 생성하기 위해서는 단순히 Random.Range(min, max)를 사용해 왔었다.

하지만 Random.Range는 난수를 생성하는 것 이상의 기능이 없어, 중복되지 않는 난수 또는 시드 값을 이용한 난수 생성은 구현할 수 없더라.

따라서 위의 구문은 배열 내 값을 순서를 섞어 중복되지 않게 출력하는 것인데, 지금이야 어느정도 이해를 하고서 이렇게 설명하고 있지만 나중에 이 글을 보았을때 여전히 기억하고 있으련지 걱정스러워 이렇게 글을 쓴다. 본격적으로 공부하는 것이 아니라 취미로 하고있다보니 어느순간 질리게 될게 분명한데, 그렇게되면 분명 이 내용도 까먹을것 같다.

 

예를 들어A, B, C, D 값을 갖는 배열이 있고 이 순서를 섞는다.

섞었더니 순서가 C, B, D, A가 나왔다면, 두번째로 섞을땐 배열의 첫번째 자리에 있는 C를 제외하고 섞는다.

따라서 B, D, A만을 가지고 순서를 섞게된다. 두번째에서 D, A, B가 나왔다면, 마찬가지로 첫번째 자리의 D를 제외하고 다시 순서를 섞는다.

세번째에서 A, B가 나왔다면 A를 제외하고 B를 가지고 순서를 섞어야하겠지만, 남은 배열값은 B 하나뿐이므로 그대로 B가 첫번째 자리에 있게된다.

처음부터 마지막까지 배열의 첫번째 자리에 뽑인 배열값을 나열하면 C, D, A, B가 된다.

즉, 섞는 횟수마다 배열의 첫째자리에 위치한 값을 제외하고서 배열을 나열하는 것으로, 중복된 값이 나오지 않게 만드는 것이다.

 

원리를 알고보니 지극히 단순하지만, 지금까지 몰랐으니 창피할 따름이더군.

위 구분은 설명을 코드로서 바꾼것 밖에 되지 않는다. 코드 자체는 단순하다. 원리를 아는게 중요하다.

 

 

2,

void RandGenerator(int seed){

int[] ar = new int[]{ 1, 2, 3, 4, 5, 6 };


System.Random Rand = new System.Random (seed);

for (int i = 0; i < ar.Length - 1; i++) {

int Index = Rand.Next (i, ar.Length);

int Temp = ar [Index];

ar [Index] = ar [i];

ar [i] = Temp;


print (ar [i]);

}

}

 

난수를 생성할때, 난수 생성의 기준이 되는 시드값을 주어 시드값에 따라 고정된 난수를 생성하게 한다.

즉, 시드값이 동일하다면 언제나 같은 난수 값을 생성한다.

 

전체적인 구문형태는 1번과 크게 다르지 않다.

하지만 System.Random이나 Rand(System.Random).Next 처럼 내가 처음으로 보는 코드가 있어 생소하게만 느껴진다.

먼저 구글링을 통해 이 두 코드를 찾아보았으나, 나오는것은 더욱더 날 어지럽게 만들었다. 설명이 또다른 의문을 만들더라.

주먹구구식으로 때려맞추고 이해하는식으로 2번을 구현하였다.

System.Random에 int형으로 시드값을 넘겨주어 난수를 생성하는 것으로 이해한다.

반복문을 통해 1번과 같이 배열은 순환하며 난수값을 생성하는데, Rand.Next에 반복문 i값을 주는 부분은 1번과 크게 다르지 않다.

1번처럼 순서를 바꾸면서 배열의 첫번째 자리의 값은 제외하는 식이다.

 

3,

public void RandomSeed(int seed){

Vector2[] Ar = new Vector2[FieldSize * FieldSize];

for (int i = 0; i < FieldSize; i++) {

for (int j = 0; j < FieldSize; j++) {

Ar [i + j * (int)FieldSize] = new Vector2 (i, j);

}

}


if (transform.childCount > 0) {

DestroyImmediate (transform.GetChild (0).gameObject);

}


GameObject Pocket = new GameObject ("Pocket");

Pocket.transform.parent = transform;


System.Random Rand = new System.Random (seed);

int ObstacleCount = (int)((FieldSize * FieldSize) * ObstacleRate);

for (int i = 0; i < ObstacleCount; i++) {

int Index = Rand.Next (i, Ar.Length);

Vector2 Temp = Ar [Index];

Ar [Index] = Ar [i];

Ar [i] = Temp;


GameObject Obj = Instantiate (Cube, new Vector3(Ar[i].x, 0, Ar[i].y), Quaternion.identity);

Obj.transform.localScale = new Vector3 (0.8f, 0.8f, 0.8f);

Obj.transform.parent = Pocket.transform;


}

}

 

3번은 2번을 응용하여 시드값에 의해 고정된 난수를 이용하여 큐브들을 생성하는 코드이다.

 

댓글 : 0 개
친구글 비밀글 댓글 쓰기