Need help randomly selecting unique values from an array

Discussion in 'Ruby' started by Paul, Aug 30, 2007.

  1. Paul

    Paul Guest

    Hi there,

    I have a simple array that I have to pick one or more unique values
    from and am kind of stumped as to how to do this. Here's the what the
    array looks like:

    foo = [2, 7, 10, 14] # (or could equal a diff't set of 4

    Now for this task, I'm not interested in the first element at all.
    I'd rather just leave it alone and not delete it though.
    What I need to do is pick 1 to 3 elements randomly from the array. I
    can't reuse the numbers.

    So, for example, if I need 1 number then it could be any of the
    elements 1-3 from the array.
    If I need 2 numbers, it could be any of elements 1-3 but I can't pick
    the same number twice. Ditto for when I need 3 numbers.

    I don't need the numbers in any particular order, so I'm just looking
    for the simplest loop/function to pick the unique numbers for me.

    Any suggestions? Thanks.
    Paul, Aug 30, 2007
    1. Advertisements

  2. Paul

    Kyle Schmitt Guest

    You could port this code over from C...

    OK ok seriously though.
    rand(foo.length) will randomly pick any one of them, but you want to
    ignore index zero so
    rand(foo.length -1 ) + 1 should do the trick.

    This is a slightly... stupid way of doing it, but considering the size
    of the data, it's a choice of what's more stupid, generating random
    numbers until you get two that aren't the same, or something like

    number1 = foo[rand(foo.length-1)+1]
    number2 = foo2[rand(foo2.length-1)+1]
    Kyle Schmitt, Aug 30, 2007
    1. Advertisements

  3. So you use foo[1..-1]. That will create a new array not containing the first
    item and leave the original array untouched.
    foo[1..-1].sort_by {rand}.first(n)
    where n is a number between 1 and 3.

    Sebastian Hungerecker, Aug 30, 2007
  4. Paul

    Paul Guest

    Excellent! That's amazingly simple! (and I never would have figured
    that out)
    It's just what I need. Thanks.
    Paul, Aug 30, 2007
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.