0

how does one use code to do this:

produce 15 random numbers [EDIT: from 1 - 15] that are not in any order, and that only occur once eg.

1 4, 2, 5, 3, 6, 8, 7, 9, 10, 13, 12, 15, 14, 11

rand() or arc4rand() can repeat some, which is not what im after.

Thanks

7
  • OK, what language are you using? Commented Apr 10, 2010 at 8:44
  • Do you really want 15 numbers between 1 and 15 in any order? Commented Apr 10, 2010 at 8:47
  • Im not concerned with the order as such, more so, everytime i run through it, its different Commented Apr 10, 2010 at 8:50
  • 1
    @Sam Jarman: Guaranteed to be different, or just highly likely to be different? Commented Apr 10, 2010 at 9:20
  • possible duplicate of stackoverflow.com/questions/1617630/… Commented Apr 10, 2010 at 9:32

2 Answers 2

4

The simplest way is to produce a collection (e.g. an array) of the numbers 1-15, and then shuffle it. (EDIT: By "collection of the numbers 1-15" I mean 1, 2, 3, 4, 5... 15. Not a collection of random numbers in the range 1-15. If I'd meant that, I'd have said so :)

You haven't given details of which platform you're on so we can't easily give sample code, but I'm a big fan of the modern variant of the Fisher-Yates shuffle. For example, in C#:

public static void Shuffle<T>(IList<T> collection, Random rng) { for (int i = collection.Count - 1; i > 0; i--) { int randomIndex = rng.Next(i + 1); T tmp = collection[i]; collection[i] = collection[randomIndex]; collection[randomIndex] = tmp; } } 

If you want to produce "more random" numbers (e.g. 15 distinct integers within the entire range of integers available to you) then it's probably easiest just to do something like this (again, C# but should be easy to port):

HashSet<int> numbers = new HashSet<int>(); while (numbers.Count < 15) { numbers.Add(rng.Next()); } List<int> list = numbers.ToList(); // Now shuffle as before 

The shuffling at the end is to make sure that any ordering which might come out of the set implementation doesn't affect the final result.

Sign up to request clarification or add additional context in comments.

10 Comments

@astander: In what way? You've got a collection with the numbers 1-15 in, and then you shuffle it - how can you get duplicates? I'll clarify the answer just in case you misunderstood it, but I think it's fine...
Generating 15 random numbers by default should be random, but we all know it is not. There should be at least some check that it does not exists already... From the OPs q produce 15 random numbers that are not in any order, and that only occur once
@astander: Where did I ever claim I'd generate 15 random numbers? I said the numbers 1-15. That's entirely different.
@astander: See the example in the question body, which does use the numbers 1-15. There's no concrete indication that he wants 15 arbitrary random numbers from a larger range. However, I've edited my answer to explain how to do that as well...
OK, the OP has edited the question produce 15 random numbers [EDIT: from 1 - 15], that makes it a different ball game.
|
2

Generate the full list, then shuffle it.

Python:

import random r = range(1, 16) random.shuffle(r) 

A random number generator by itself can, almost by definition, not do what you want. It would need to keep track of all the numbers already generated, which would be as memory-hungry as the solution sketched above.

1 Comment

Maybe you should've mentioned that, then. Either way, Python is usually a nice way to provide executable pseudo-code.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.