Unity C#随机唯一编号

时间:2014-08-22 14:16:35

标签: c# random unity3d

我想生成随机唯一编号。这些是代码:

public int NewNumber(int r) {
    int[] numbers = new int[r];   
    int a = Random.Range (0, r);
    if(numbers.Contains(a)) {
        a = Random.Range (0, r);
    }
    return a;
}

当NewNumber(5)工作十次时,我得到的结果如下:5,4,3,4,1,2,4,2,5,3

但我想要的是:5,3,4,2,1

哪里错了?

5 个答案:

答案 0 :(得分:0)

每次调用NewNumber方法时,您都在重置持有者,您需要将持有者置于方法之外。

int[] numbers = new int[r];   
 public int NewNumber(int r) {
    int a = Random.Range (0, r);
    if(!numbers.Contains(a)) {
        a = Random.Range (0, r);
    }
    return a;
}

如果使用列表而不是数组会更好;

List<int> numbers = new List<int>();
public int NewNumber(int r) {
   int a = Random.Range (0, r);
   if(!numbers.Contains(a)) {
       numbers.Add(a);
   }
   return a;
}

答案 1 :(得分:0)

如果您不希望返回的范围内只有一个数字,则解决方案不需要数组。如果随机数恰好是您不想要的,则只需重复创建一个新的随机数。

public int RandomNumberInRangeExcluding(int range, int excludedNumber)
{
    int r = excludedNumber;
    while (r == excludedNumber)
    {
        r = Random.Range(0, range);
    }
    return r;
}

答案 2 :(得分:0)

nexx是对的,但除非你将它包裹在一个循环中,否则你仍然会得到重复的东西,比如......

List<int> numbers = new List<int>();

public int NewNumber(int r) {

    int a = 0;

    while(a==0){    
        a = Random.Range (0, r);
        if(!numbers.Contains(a)) {
            numbers.Add(a);
        }else{
            a=0;
        }
    }
    return a;
}

答案 3 :(得分:0)

我认为这是因为当numbers包含a时,您只会随机一次。尝试将if更改为while,以便随机播放,直到numbers不包含a

int[] numbers = new int[r];   
public int NewNumber(int r) {
    int a = Random.Range (0, r);
    while(numbers.Contains(a)) { // change this to while
        a = Random.Range (0, r);
    }
    return a;
}

答案 4 :(得分:0)

这可以达到相同的效果,无需等待Random有希望吐出任何需要的数字

    static void Main(string[] args)
    {
        List<int> rands = GetRandoms(10);
    }

    static IEnumerable<int> GetRandoms(int size)
    {
        List<int> rands = new List<int>();

        for (int i = 1; i <= size; i++)
        {
            rands.Add(i);
        }

        return rands.OrderBy(i => Guid.NewGuid());
    }