34

Possible Duplicate:
Access random item in list

I have an array with numbers and I want to get random elements from this array. For example: {0,1,4,6,8,2}. I want to select 6 and put this number in another array, and the new array will have the value {6,....}.

I use random.next(0, array.length), but this gives a random number of the length and I need the random array numbers.

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;
5
  • 1
    With a simple random selection you will get duplicates. Do you want to return a shuffled copy of caminohormiga ? Commented Jan 12, 2013 at 20:56
  • 1
    @shebystian are duplicates applicable?? Commented Jan 12, 2013 at 20:57
  • Do you want to shuffle or to rotate your caminohormiga array? Commented Jan 12, 2013 at 21:01
  • If you dont want duplicates and assuming the output it would be better to use shuffle instead rather than checking for duplicates, which do takes time Commented Jan 12, 2013 at 21:21
  • If you are ok with duplicates, view the accepted answer. If you want it shuffled without duplicates, view this answer. Commented Feb 14, 2017 at 17:09

6 Answers 6

53

I use the random.next(0, array.length), but this give random number of the length and i need the random array numbers.

Use the return value from random.next(0, array.length) as index to get value from the array

 Random random = new Random();
 int start2 = random.Next(0, caminohormiga.Length);
 Console.Write(caminohormiga[start2]);
Sign up to request clarification or add additional context in comments.

5 Comments

thanks! the code finally works, but the numbers are repeat, any idea to how avoid the repeat?
Yes, remove the element form array in the loop.
To avoid the repeated numbers, use IEnumerable.OrderBy(n => Guid.NewGuid()). See my answer.
Getting repeated items might be because of how Random class behaves. Try not to instantiate Random every you get a random number, keep it single instance.
Use Stack to avoid logical mistakes. use stack.push('abc') method to insert value in stack before using stack.pop(), use stack.Peek() as it will give the top value as an object of the stack. Convert it accordingly string or integer whatever u had pushed it. after getter the value, use stack.pop(). u will never ever get the same value from the stack as the used value was popped.
34

To shuffle

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

1 Comment

the best solution so far. Just 1 line solution
5

You just need to use the random number as a reference to the array:

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

Comments

3

Try like this

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

instead of

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

Comments

2

I noticed in the comments you wanted no repeats, so you want the numbers to be 'shuffled' similar to a deck of cards.

I would use a List<> for the source items, grab them at random and push them to a Stack<> to create the deck of numbers.

Here is an example:

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

So then:

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 Comment

Shouldn't rand.Next(0, list.Count); be rand.Next(0, list.Count - 1);? Because if we get for example index 5 and there is 5 elements we will get out of range exception i think. But i like your solution.
0
Console.Write(caminohormiga[start2]);

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.