2013-01-12 16 views
10

Eventuali duplicati:
Access random item in listCome ottenere i valori casuali da array in C#

Ho un array con numeri e voglio ottenere elementi casuali da questo array. Ad esempio: {0,1,4,6,8,2}. Voglio selezionare 6 e mettere questo numero in un altro array, e il nuovo array avrà il valore {6, ....}.

Io uso random.next (0, array.length), ma questo dà un numero casuale della lunghezza e ho bisogno dei numeri di array casuali.

for (int i = 0; i < caminohormiga.Length; i++) 
{ 
    if (caminohormiga[i] == 0) 
    { 
     continue; 
    } 

    for (int j = 0; j < caminohormiga.Length; j++) 
    { 
     if (caminohormiga[j] == caminohormiga[i] && i != j) 
     { 
      caminohormiga[j] = 0; 
     } 
    } 
} 

for (int i = 0; i < caminohormiga.Length; i++) 
{ 
    int start2 = random.Next(0, caminohormiga.Length); 
    Console.Write(start2); 
} 

return caminohormiga; 
+1

Con una semplice selezione casuale si ottengono i duplicati. Vuoi restituire una copia mescolata di 'caminohormiga'? –

+1

@shebystian sono duplicati applicabili ?? – exexzian

+0

Vuoi mescolare o ruotare la tua matrice 'caminohormiga'? –

risposta

16

Uso il random.next (0, array.length), ma questo invia numero casuale di lunghezza e ho bisogno dei numeri casuali matrice.

Utilizzare il valore restituito da random.next(0, array.length) come indice per ottenere valore dalla array

Random random = new Random(); 
int start2 = random.Next(0, caminohormiga.Length); 
Console.Write(caminohormiga[start2]); 
+1

grazie! il codice funziona finalmente, ma i numeri sono ripetuti, qualche idea su come evitare la ripetizione? – Shebystian

+1

Sì, rimuovere l'array del modulo elemento nel ciclo. – Tilak

+0

Per evitare i numeri ripetuti, usare 'IEnumerable.OrderBy (n => Guid.NewGuid())'. Vedi la mia [risposta] (http://stackoverflow.com/a/14297930/444610). –

1

Hai solo bisogno di utilizzare il numero casuale come riferimento alla matrice:

var arr1 = new[]{1,2,3,4,5,6} 
var rndMember = arr1[random.Next(arr1.Length)]; 
0
Console.Write(caminohormiga[start2]); 
2

Prova in questo modo

int start2 = caminohormiga[ran.Next(0, caminohormiga.Length)]; 

invece di

int start2 = random.Next(0, caminohormiga.Length); 
12

Per la riproduzione casuale

int[] numbers = new [] {0, 1, 4, 6, 8, 2}; 
int[] shuffled = numbers.OrderBy(n => Guid.NewGuid()).ToArray(); 
+2

Approccio interessante! – vbocan

+0

Definitivamente la migliore risposta per ottenere N elementi casuali da un set. Molto bella. –

1

ho notato nei commenti che volevi senza ripetizioni, quindi si desidera che i numeri da 'mescolate' simile ad un mazzo di carte .

vorrei usare un List<> per gli elementi di origine, li afferrare a caso e spinta loro di un Stack<> per creare il ponte di numeri.

Ecco un esempio:

private static Stack<T> CreateShuffledDeck<T>(IEnumerable<T> values) 
{ 
    var rand = new Random(); 

    var list = new List<T>(values); 
    var stack = new Stack<T>(); 

    while(list.Count > 0) 
    { 
    // Get the next item at random. 
    var index = rand.Next(0, list.Count); 
    var item = list[index]; 

    // Remove the item from the list and push it to the top of the deck. 
    list.RemoveAt(index); 
    stack.Push(item); 
    } 

    return stack; 
} 

Dunque:

var numbers = new int[] {0, 1, 4, 6, 8, 2}; 
var deck = CreateShuffledDeck(numbers); 

while(deck.Count > 0) 
{ 
    var number = deck.Pop(); 
    Console.WriteLine(number.ToString()); 
}