【问题标题】:Unity C# Random Unique NumberUnity C# 随机唯一编号
【发布时间】:2014-08-22 14:16:34
【问题描述】:

我想生成随机唯一数字。这些是代码:

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

哪里错了?

【问题讨论】:

  • “当 NewNumber(5) 工作十次时”是什么意思?
  • 你说当它运行 10 次时,你会得到 10 个结果。那么,运行它 5 次可能吗?请详细说明您的问题。
  • 为什么要使用 Random 来获取特定的数字序列?
  • 请注意,您在每次调用中都创建了一个新数组...所以它不会知道之前返回的内容...
  • 他试图生成 5 个数字,其中对随机发生器的每个后续调用都会返回一个以前没有返回的数字。他想要一组随机分布的 5 个数字,例如15324 42153等

标签: c# random unity3d


【解决方案1】:

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;
}

【讨论】:

    【解决方案2】:

    您每次调用 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;
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我认为这是因为当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;
        }
        

        【讨论】:

          【解决方案5】:

          这实现了相同的结果,而无需等待 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());
              } 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-09-28
            • 1970-01-01
            • 2017-08-16
            • 2016-02-05
            • 1970-01-01
            • 2012-08-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多