【问题标题】:Choose a number from an array从数组中选择一个数字
【发布时间】:2023-03-29 00:13:01
【问题描述】:

是否有任何函数或方法可以从数组中随机选择一个数字(或 2 个或更多数字)?

【问题讨论】:

标签: c++ c random


【解决方案1】:

根据您需要的数字数量、数组的大小以及数组是否需要保留其顺序,您可以使用std::random_shuffle 对数组重新排序,然后从 0..n-1 循环得到n 个随机数。当您想要获得相对于数组长度的大量数字时,这会更好。

如果这看起来不合适,您可以使用 srand()rand() % n 作为数组的索引,以获得随机选择的相当好的近似值。

【讨论】:

    【解决方案2】:

    对于大小为 n 的数组,只需在 0..n-1 范围内生成一个随机数,然后选择数组中索引的数字。

    【讨论】:

    • 请注意确保为每个元素赋予相等的概率。像 floor(rand(0..1) * n) 这样的东西应该可以解决问题。
    • 仅当您关心可追溯性或类似的情况下,为了快速目的,旧的 rand() 就可以了。
    【解决方案3】:
    int RandomElement(int *array, int size)
    {
       return array[ rand() % size ];     
    }
    

    如果您接受 rand 作为随机数生成器。

    【讨论】:

      【解决方案4】:
      randomElement = arr[rand() % ARRAY_SIZE];
      

      这是最简单的方法。如果你想做一些更复杂的事情,比如为数组的不同元素分配不同的概率,你可以使用 Boost.Random 库。

      【讨论】:

        【解决方案5】:

        rand() % n 通常几乎是非随机的,至少对于旧的(坏的)随机生成器来说是这样(有很多,要小心)。

        如果您负担得起转换,则更好的是 ((double)rand() / MAX_RAND) * n。或者使用已知低位随机的随机生成器,对低 log n 位进行拒绝。

        【讨论】:

          【解决方案6】:

          如果您想从数组中选择两个随机数,而不重复使用相同的数字,则可以使用以下方法

          int array[SIZE];
          
          i = rand() % SIZE;
          rand1 = array[i];
          j = 1 + rand() % (SIZE - 2);
          rand2 = array[(i + j) % SIZE];
          

          【讨论】:

            【解决方案7】:
              #include<iostream>
              #include<cstdlib>
            
              template<typename T,size_t n>
              T randElem(T (&a)[n])
              {
            
                    return a[rand() % n];
              }
            
            
              int main()
              {
                  int a[]={1,2,3,4,5};
            
                  int n=randElem<int>(a);
                  std::cout<<n;
              } 
            

            【讨论】:

              猜你喜欢
              • 2010-12-10
              • 2013-03-18
              • 2016-12-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-09-02
              • 1970-01-01
              相关资源
              最近更新 更多