【问题标题】:Random() efficiency in C++C++ 中的 Random() 效率
【发布时间】:2015-03-31 01:44:04
【问题描述】:

我正在编写函数,我需要找到 1 - 10 之间的随机数。最简单的方法之一是使用 random() libc 调用。我会经常使用这个功能。但我不知道它的效率如何。如果有人知道 random() 的效率会有所帮助吗?

我还注意到 random() 在 2 次运行中给出了相同的模式。

int main()
{
   for(int i=0;i<10;i++)
   {
    cout << random() % 10 << endl;     
   }
}

第一次输出:- 3 6 7 5 3 5 6 2 9 1

第二次我也得到了同样的输出。

那怎么是随机的呢?

【问题讨论】:

  • 如果您担心性能,请使用分析器。如果你用相同的种子运行随机化器,它总是会给出相同的输出。
  • 实际上我使用了 Linux perf 但它没有显示任何东西(比如它在哪里消耗时间)。它只是显示它消耗了多少 CPU 周期,大约占总 CPU 的 1.73%。
  • “性能”中的“效率”或“随机数有多好”中的“效率”?后者显然是“您需要使用 srand()”[或类似的] 在不同点开始随机数序列的情况。 “好”的随机数不是微不足道的,所以如果你需要真正好的随机数,你可能需要进一步的工作 [e.g.可预测性成为问题的游戏,或将数字用于重要分布的科学目的]
  • 否定标记的任何原因。

标签: c++ c linux performance random


【解决方案1】:

其他人已经解释了为什么每次都是相同的序列,但这就是你用C++生成随机数的方式:

#include <random>

int main() {
    std::random_device rd{}; //(hopefully) truly random device
    std::mt19937 engine{rd()}; //seed a pseudo rng with random_device
    std::uniform_int_distribution<int> d(1,10); //1 to 10, inclusive
    int RandNum = d(engine); //generate
    return 0;
}

http://en.cppreference.com/w/cpp/numeric/random

【讨论】:

    【解决方案2】:

    当然,实际执行时间取决于您的平台,但它非常简单,乘法和除法或移位:

    What common algorithms are used for C's rand()?

    我认为你不必担心。如果您需要大量随机数,那么另一个随机源可能是您更好的选择。

    如果您正在寻找调整,如何将 rand() 的结果拆分为单独的数字,以便每次调用获得多个结果。

    【讨论】:

    • rand() 的结果拆分为单个数字的想法(例如,通过忽略 0000、1111、1110、1101、1100 来获得 1-10 的随机数的 4 位块和 1011) 是一个有趣的问题,但以这种方式生成 test the quality of the random numbers 很重要,因为大多数伪随机数中的低位通常比高值位的随机性要小。
    【解决方案3】:

    这种方式非常简单有效,只需要设置种子即可:

    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    
    using namespace std;
    
    int main(){
        srand(time(NULL));
        for(int i=0;i<10;i++)
            cout << rand() % 10 << endl;     
    }
    

    【讨论】:

      【解决方案4】:

      要解决在 2 次运行中获得相同模式的问题,只需添加函数 randomize()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多