2013-01-12 9 views
10

Powiel możliwe:
Access random item in listJak uzyskać losowych wartości z tablicy w C#

Mam tablicę z numerami i chcę dostać losowe elementy z tej tablicy. Na przykład: {0,1,4,6,8,2}. Chcę wybrać 6 i umieścić ten numer w innej tablicy, a nowa tablica będzie miała wartość {6, ....}.

Używam random.next (0, array.length), ale daje to losową liczbę długości i potrzebuję losowych numerów tablicowych.

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

Z prostego losowego wyboru otrzymasz duplikaty. Czy chcesz zwrócić przetasowaną kopię 'caminohormiga'? –

+1

@Shebystian są duplikaty dotyczy? – exexzian

+0

Czy chcesz przetasować lub obrócić tablicę 'caminohormiga'? –

Odpowiedz

16

używać random.next (0 Array.length), ale daje liczbę losową długości i trzeba liczb losowych tablicy.

Użyj wartości zwracanej z random.next(0, array.length) jako wskaźnik, aby uzyskać wartość z array

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

dzięki! kod wreszcie działa, ale liczby są powtórzone, każdy pomysł, jak uniknąć powtórzenia? – Shebystian

+1

Tak, usuń tablicę postaci elementu w pętli. – Tilak

+0

Aby uniknąć powtarzających się liczb, użyj 'IEnumerable.OrderBy (n => Guid.NewGuid())'. Zobacz mój [odpowiedź] (http://stackoverflow.com/a/14297930/444610). –

1

Wystarczy użyć liczb losowych jako odniesienie do tablicy:

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

Spróbuj tego tak

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

zamiast

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

Aby przetasować

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

Interesujące podejście! – vbocan

+0

Zdecydowanie najlepsza odpowiedź, aby uzyskać N losowych elementów z zestawu. Bardzo dobrze. –

1

zauważyłem w komentarzach nie chciał powtórzenia, więc chcesz numery do „tasuje” podobna do talii kart .

chciałbym użyć List<> dla elementów źródłowych, chwycić je losowo i naciśnięciem im do Stack<> stworzyć talię liczb.

Oto przykład:

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; 
} 

Więc:

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()); 
} 
Powiązane problemy