Câu hỏi Cách lấy các giá trị ngẫu nhiên từ mảng trong C # [duplicate]


Có thể trùng lặp:
Truy cập mục ngẫu nhiên trong danh sách 

Tôi có một mảng với các số và tôi muốn lấy các phần 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 chiều dài và tôi cần các 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;

12
2018-01-12 20:54


gốc


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 ? - Henk Holterman
@ shebystian là bản sao áp dụng ?? - exexzian
Bạn có muốn trộn hoặc xoay caminohormiga mảng? - Alexander Balte
Nếu bạn không muốn bản sao và giả sử đầu ra nó sẽ là tốt hơn để sử dụng shuffle thay vì kiểm tra cho các bản sao, mà phải mất thời gian - exexzian
Nếu bạn đồng ý với các bản sao, hãy xem câu trả lời. Nếu bạn muốn nó xáo trộn mà không có bản sao, hãy xem câu trả lời. - seth flowers


Các câu trả lời:


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

Sử dụng giá trị trả lại từ random.next(0, array.length) làm chỉ mục để lấy giá trị từ array

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

17
2018-01-12 20:56



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
Có, loại bỏ mảng biểu mẫu phần tử trong vòng lặp. - Tilak
Để tránh các số lặp lại, hãy sử dụng IEnumerable.OrderBy(n => Guid.NewGuid()). Xem của tôi câu trả lời. - seth flowers


Xáo trộn

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

14
2018-01-12 21:02



Cách tiếp cận thú vị! - vbocan
Chắc chắn câu trả lời tốt nhất để có được N yếu tố ngẫu nhiên từ một tập hợp. Rất đẹp. - Joseph Serido


Thử như thế này

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

thay vì

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

2
2018-01-12 21:01





Bạn chỉ cần sử dụng số ngẫu nhiên làm tham chiếu đến mảng:

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

1
2018-01-12 20:57





Tôi nhận thấy trong các ý kiến ​​bạn không muốn lặp lại, vì vậy 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 List<> cho các mục nguồn, lấy chúng ngẫu nhiên và đẩy họ đến một Stack<> để tạo ra bộ bà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());
}

1
2018-01-12 21:56





Console.Write(caminohormiga[start2]);

0
2018-01-12 20:57