我想知道一种算法来查找不可重复的唯一随机数。每当我在程序中调用它时,应该给出一个唯一的随机数,这个数字之前没有给出。我想知道,因为在游戏或应用程序中有一些时间来了这种要求。
对于前。在游戏中,我创建了一些对象并将它们保存在一个数组中,并希望通过随机和唯一的方式检索它们,而不想从数组中删除它们。这只是一个场景。
我尝试了一些替代方案,但他们表现不佳,从未得到过这个问题的答案。
如何通过编程方式实现?
提前致谢。
答案 0 :(得分:1)
下面的代码生成1-15的唯一随机数。根据您的要求修改: -
public class Main
{
int i[]= new int[15];
int x=0;
int counter;
public int getNumber()
{
return (int)((Math.random()*15)+1);
}
public int getU()
{
x = getNumber();
while(check(x))
{
x = getNumber();
}
i[counter]=x;
counter++;
return x;
}
public boolean check(int x)
{
boolean temp = false;
for(int n=0;n<=counter;n++)
{
if(i[n]==x)
{
temp = true;
break;
}
else
{
temp = false;
}
}
return temp;
}
public static void main(String args[])
{
Main obj = new Main();
for(int i=0;i!=15;i++)
{
System.out.println(obj.getU());
}
}
}
了解更多信息,请参阅以下链接: -
答案 1 :(得分:1)
在我看来,最好的选择是从输入列表中删除返回的数字 让我解释一下:
从整个范围开始,例如:range = [0,1,2,3,4]
扔一个随机索引,让我们说3.
现在从范围中移除范围[3],得到范围= [0,1,3,4]
等等。
这是python中的示例代码:
import random
rangeStart = 0
rangeEnd = 10
rangeForExample = range(rangeStart, rangeEnd)
randomIndex = random.randrange(rangeStart, rangeEnd)
randomResult = rangeForExample[randomIndex]
rangeForExample.remove(randomResult)
答案 2 :(得分:0)
这可以通过多种方式实现。以下是其中两个(目前在我的脑海中):
保留以前生成的值。(对于基于范围的随机数生成) 在此方法中,您生成一个随机数并将其存储(在文件或数据库中),以便在您生成下一个否时。您可以将它与之前的数字相匹配,如果已经生成,则将其丢弃。
每次生成唯一编号。 (对于基于非范围的随机数生成) 在这种方法中,您可以使用一系列或类似的东西,例如,它可以为您提供唯一的数字,当前时间毫秒。
答案 3 :(得分:0)
count
。index
。index
的项目。index
。当我看到你做iOS时,我会在Objective-C中给出一个例子。
NSMutableArray *array = <creation of your array>;
int count = array.count;
while (1) {
int randomIndex = arc4random() % count;
id object = [array objectAtIndex:randomIndex];
NSLog(@"Random object: %@", object);
[array removeObject:object];
count--; // This is important
if(array.count == 0)
{
return;
}
}
答案 4 :(得分:0)
以下是我能想到的两个选项..
使用历史记录列表
1. Keep past picked random numbers in a list
2. Find a new random number
3. If the number exist in history list, go to 2
4. [optional] If the number lower history list randomness, go to 2
5. add the number to the history list
使用跳转
At Time 0: i=0; seed(Time); R0 = random() % jump_limit
1. i++
2. Ji = random() % jump_limit
3. Ri = Ri-1 + Ji