2013-01-12 64 views
10

thể trùng lặp:
Access random item in listLàm thế nào để có được các giá trị ngẫu nhiên từ mảng trong C#

Tôi có một mảng với những con số và tôi muốn để có được các yếu tố ngẫu nhiên từ mảng này. Ví dụ: {0,1,4,6,8,2}. Tôi muốn chọn 6 và đặt số này vào mảng khác và mảng mới sẽ có giá trị {6, ....}.

Tôi sử dụng random.next (0, array.length), nhưng điều này cho một số ngẫu nhiên của độ dài và tôi cần số mảng ngẫu nhiên.

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

Với một lựa chọn ngẫu nhiên đơn giản, bạn sẽ nhận được bản sao. Bạn có muốn trả lại một bản sao xáo trộn của 'caminohormiga'? –

+1

@shebystian là bản sao áp dụng được không ?? – exexzian

+0

Bạn có muốn trộn hoặc xoay mảng 'caminohormiga' của mình không? –

Trả lời

16

tôi sử dụng random.next (0, array.length), nhưng điều này cho số điện thoại ngẫu nhiên của chiều dài và tôi cần những con số mảng ngẫu nhiên.

Sử dụng giá trị trả về từ random.next(0, array.length) như chỉ số để có được giá trị từ array

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

cảm ơn! mã cuối cùng hoạt động, nhưng các con số được lặp lại, bất kỳ ý tưởng nào về cách tránh lặp lại? – Shebystian

+1

Có, loại bỏ mảng biểu mẫu phần tử trong vòng lặp. – Tilak

+0

Để tránh các số lặp lại, sử dụng 'IEnumerable.OrderBy (n => Guid.NewGuid())'. Xem [answer] của tôi (http://stackoverflow.com/a/14297930/444610). –

1

Bạn chỉ cần sử dụng các số ngẫu nhiên như một tham chiếu đến các mảng:

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

Thử như thế này

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

thay vì

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

Để xáo trộn

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

Cách tiếp cận thú vị! – vbocan

+0

Chắc chắn câu trả lời tốt nhất để có được N phần tử ngẫu nhiên từ một tập hợp. Rất đẹp. –

1

tôi nhận thấy trong các ý kiến ​​bạn muốn không lặp đi lặp lại, do đó bạn muốn các con số để được 'xáo trộn' tương tự như một cỗ bài .

Tôi sẽ sử dụng một List<> cho các mục nguồn, lấy họ một cách ngẫu nhiênđẩy chúng vào một Stack<> để tạo ra boong số.

Dưới đây là một ví dụ:

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

Vì vậy, sau đó:

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()); 
} 
Các vấn đề liên quan