2016-06-01 2 views
0

0 및 많지 않은 1로 채워진 2D 배열 목록에서 특정 정수 (1)를 무작위로 가져 오려고합니다. 나는이를 만들고, 그것을 작동 :무작위로 2D 배열에서 특정 int 선택

while (wallsList[randomX, randomY] != 1) 
{ 
    randomX = randomizer.Next(34); 
    randomY = randomizer.Next(34); 
} 

그것의 단점, 그것은 단지 하나의 시간을 찾기 위해 너무 많은 시간이 걸리는 INT (1), 그리고 새로운 이후 1000 배 이상이 과정을 수행해야한다는의 매번 2D 배열에 1이 추가되고 제거됩니다. 프로그램을 시작하는 데 약 3 분이 걸립니다. 최적화 된 버전이 있는지 알고 싶습니다. 많은 것을 검색하여 1D 어레이에 대해서만이 솔루션을 찾았습니다. 시간 내 줘서 고마워.

+4

왜 무작위로 검색해야합니까? 왜 그것을 선형 적으로 찾지 않습니까? – Gusman

+0

최적화 된 버전은 임의의 인덱스에서 알려진 값을 검색하지 않는 것입니다. 이와 같이 무작위로 검색하는 좋은 이유가없는 한 그렇게하지 마십시오. –

+0

귀하의 질문은 무엇입니까? 1을 더 빨리 얻는 방법? 왜 처음에 무작위로 벽을 찾으십니까? 이것은 의미가 없다. –

답변

3

희소 배열이 있습니다. X/Y int 쌍의 목록으로 표현하지 않겠습니까? 그런 다음 X/Y int 쌍이 목록에 있으면 1이고 그렇지 않으면 0입니다.

그런 다음 1이 포함 된 임의의 값/셀을 찾으려면 목록에서 임의 값을 선택하면됩니다 .

당신은 당신이 취할 수있는 몇 가지 방법이 있습니다

new List <Tuple<int, int>> { new Tuple<int, int>(1, 5), new Tuple<int, int>(2, 7) } 
+0

늦게 대답 해 주셔서 감사합니다. 이것은 나를 위해 일했다, 고마워! –

0

같은 목록을 사용할 수 있습니다. 하나는 2 차원 배열에서 좌표 쌍 목록과 같은 것으로 표현을 변경하는 것입니다. 무작위로 하나를 선택하는 것은 쉽지만, 수행하려는 다른 작업이 더 어려워 질 수 있습니다. 이 방법은 1의 중 하나를 균일하게 선택하는 이점이 있습니다.. 이 품질을 희생시키려는 또 다른 접근법은 임의의 x와 y를 선택한 다음 x 또는 y로 스캔하여 다음 1을 반환하는 것입니다. 이는 첫 번째 솔루션만큼 효율적이지 않습니다.

3

임의의 추측은 대부분 실패하므로 까지은 알려진 양호한 색인의 두 번째 배열을 만들고 무작위로 검색하는 것이 더 효율적입니다.

var randomizer = new Random(); 
var wallsList = new int[34, 34]; 
wallsList[23,11] = 1; 

// Build an array of points that are known to pass 
var knownHits = 
    (from x in Enumerable.Range(0, 34) 
    from y in Enumerable.Range(0, 34) 
    where wallsList[x, y] == 1 
    select new { x, y }) 
    .ToArray(); 

// Pick a random point from previous array 
var randomPoint = knownHits[randomizer.Next(knownHits.Length)]; 
var randomX = randomPoint.x; 
var randomY = randomPoint.y; 

Console.Write($"X = {randomX}, Y = {randomY}"); // X = 23, Y = 11 

또는이 같은 보조 배열을 만들 수 :

var knownHits = wallsList.Cast<int>() 
    .Select((v, i) => new { v, x = i/34, y = i % 34 }) 
    .Where(x => x.v == 1) 
    .ToArray(); 
+1

나는 이것이 일종의 숙제라고 생각한다. 그래서 OP가 이것을 할 수 있을지 모르겠지만,이 방법은 그것을하는 것이 훨씬 낫다. –

0

나는 무작위로 특정 정수를 얻을 수 에 노력하고있어을 (1) 공의로 채워진 2D 배열 목록에서 많지 않음

임의로 수행해야하는 경우 접근 방법이 좋습니다. 그러나 동일한 색인을 다시 그리지 않아도 개선 할 수있는 것은 무엇입니까?

var randomizer = new Random(); 
var wallsList = new int[34, 34]; 
wallsList[01, 23] = 1; 

var indexes = 
    from x in Enumerable.Range(0, 34) 
    from y in Enumerable.Range(0, 34) 
    select new { X = x, Y = y }; 

var result = indexes 
    .OrderBy(_ => randomizer.Next()) 
    .FirstOrDefault(index => wallsList[index.X, index.Y] == 1); 
if (result == null) 
    throw new Exception("Index not found"); 

Console.WriteLine("1 is found at[{0}, {1}]", result.X, result.Y); 
관련 문제