2016-06-01 14 views
0

Ich versuche, eine bestimmte Ganzzahl (1) aus einer 2D-Array-Liste mit Nullen und nicht viele Einsen gefüllt. Ich habe dies, und es funktioniert:Wählen Sie zufällig ein bestimmtes int aus einem 2D-Array

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

Der Nachteil davon ist es, dass es zu viel Zeit in Anspruch nimmt nur die int eine Zeit zu finden (1), und ich habe diesen Prozess mehr als 1000-mal zu tun, da neue Einsen werden jedes Mal hinzugefügt und in das 2D-Array entfernt. Es dauert ungefähr 3m, um mein Programm zu starten, also würde ich gerne wissen, ob es eine optimierte Version von diesem gibt, ich suchte viel und fand nur diese Lösung für 1D-Arrays. Vielen Dank für Ihre Zeit.

+4

Warum müssen Sie nach dem Zufallsprinzip suchen? warum suchen Sie nicht linear? – Gusman

+0

Eine optimierte Version davon wäre, bei zufälligen Indizes nicht nach einem bekannten Wert zu suchen. Es sei denn, es gibt einen sehr guten Grund, so zufällig zu suchen. –

+0

Was ist Ihre Frage? Wie bekomme ich die 1 schneller? Warum suchst du zufällig nach einer Wand? Das macht keinen Sinn. –

Antwort

3

Sie haben ein spärliches Array. Warum nicht als eine Liste von X/Y int Paaren darstellen? Wenn das Paar X/Y int in der Liste ist, ist es eine 1, wenn nicht, ist es eine 0.

Dann, um einen zufälligen Wert/Zelle mit 1 zu finden, wählen Sie einfach einen zufälligen Wert aus der Liste .

Sie könnten eine Liste wie

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

Sorry für die späte Antwort. Das hat bei mir funktioniert, danke! –

0

Es gibt ein paar Ansätze verwenden Sie nehmen können. Eine wäre, Ihre Repräsentation von einem 2D-Array in etwas wie eine Liste von Koordinatenpaaren zu ändern. Jetzt ist es einfach, eine zufällig auszuwählen, aber vielleicht werden andere Operationen, die Sie durchführen wollen, schwieriger. Dieser und Ihr Ansatz haben den Vorteil, dass sie einen der 1 einheitlich auswählt. Ein anderer Ansatz, der diese Qualität opfern würde, wäre, ein zufälliges x und y zu wählen und dann die nächste 1 zurückzugeben, wobei nach x oder y gesucht wird. Dies ist auch nicht so effizient wie die erste Lösung.

3

Da die meisten Ihrer zufälligen Vermutungen fehlschlagen, wäre es weiter effizienter, ein zweites Array von bekannten guten Indizes zu erstellen und zufällig nur diese zu suchen.

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 

Alternativ können Sie das sekundäre Array wie folgt aufbauen:

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

Ich vermute, das ist eine Art Hausaufgabe, also weiß ich nicht, ob das OP das kann, aber ja, auf diese Weise ist es viel besser, es zu tun –

0

Ich versuche zu zufällig eine bestimmte ganze Zahl erhalten (1) aus einem 2D-Array-Liste mit 0'en gefüllt und nicht viele

Wenn Sie es nach dem Zufallsprinzip tun müssen, ist Ihr Ansatz in Ordnung. Was Sie jedoch verbessern können, indem Sie vermeiden, denselben Index erneut zu zeichnen:

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); 
Verwandte Themen