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
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.
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.