用于在范围中查找随机数和唯一数的算法

时间:2014-05-21 07:12:13

标签: algorithm random unique

我想知道一种算法来查找不可重复的唯一随机数。每当我在程序中调用它时,应该给出一个唯一的随机数,这个数字之前没有给出。我想知道,因为在游戏或应用程序中有一些时间来了这种要求。

对于前。在游戏中,我创建了一些对象并将它们保存在一个数组中,并希望通过随机和唯一的方式检索它们,而不想从数组中删除它们。这只是一个场景。

我尝试了一些替代方案,但他们表现不佳,从未得到过这个问题的答案。

如何通过编程方式实现?

提前致谢。

5 个答案:

答案 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());
          }
     }
}

了解更多信息,请参阅以下链接: -

https://community.oracle.com/message/4860317

Expand a random range from 1–5 to 1–7

答案 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)

这可以通过多种方式实现。以下是其中两个(目前在我的脑海中):

  1. 保留以前生成的值。(对于基于范围的随机数生成) 在此方法中,您生成一个随机数并将其存储(在文件或数据库中),以便在您生成下一个否时。您可以将它与之前的数字相匹配,如果已经生成,则将其丢弃。

  2. 每次生成唯一编号。 (对于基于非范围的随机数生成) 在这种方法中,您可以使用一系列或类似的东西,例如,它可以为您提供唯一的数字,当前时间毫秒。

答案 3 :(得分:0)

  1. 获取阵列的count
  2. 在{0,count)之间随机index
  3. 检索数组中index的项目。
  4. index
  5. 删除该项目

    当我看到你做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