Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 比rand()快?_C_Random - Fatal编程技术网

C 比rand()快?

C 比rand()快?,c,random,C,Random,我正在研究一种算法,它需要以尽可能快的速度生成数百万个数字。实际上,我发现我的算法的rand()函数占用了75%的处理时间 所以我在找更快的。而且我根本不需要大范围。(我只需要1000以下的整数) 你知道我需要什么吗 谢谢 编辑: 我使用这个数字来洗牌少于1000个实体的组 我发现了更多关于“快速兰德”的信息。还有SSE版本,速度更快,一次生成4个数字 算法是一种非常快速但平衡的伪随机数生成器 下面是一个示例实现:在大多数系统中,rand()是一个伪随机数生成器。因此,代码应该只是几个移位+位或

我正在研究一种算法,它需要以尽可能快的速度生成数百万个数字。实际上,我发现我的算法的rand()函数占用了75%的处理时间

所以我在找更快的。而且我根本不需要大范围。(我只需要1000以下的整数)

你知道我需要什么吗

谢谢

编辑:

我使用这个数字来洗牌少于1000个实体的组

我发现了更多关于“快速兰德”的信息。还有SSE版本,速度更快,一次生成4个数字

算法是一种非常快速但平衡的伪随机数生成器

下面是一个示例实现:

在大多数系统中,rand()是一个伪随机数生成器。因此,代码应该只是几个移位+位或运算,并且能够在一台典型的PC上每秒生成数百万个数字。你不能说你得到了什么,你的硬件是什么,或者你正在使用哪个C库,所以很难理解为什么你的实现“缓慢”


也许您可以尝试重用位:取最低的10位(=1024个值),模1000得到您想要的数字范围。然后移位,当位用完时,再次调用
rand()
以获取更多位。

如果您使用的是英特尔常春藤桥接处理器,则可以使用指令将随机数生成转移到硬件上

static unsigned int g_seed;

// Used to seed the generator.           
inline void fast_srand(int seed) {
    g_seed = seed;
}

// Compute a pseudorandom integer.
// Output value in range [0, 32767]
inline int fast_rand(void) {
    g_seed = (214013*g_seed+2531011);
    return (g_seed>>16)&0x7FFF;
}
这是关于RDRAND的吞吐量


您还可以确定处理器是否支持RDRAND,是否使用硬件卸载,或者是否退回到软件实现

3秒钟的75%并不多。通常,
rand()
速度非常快。你的代码运行多久才能创建100万个数字?不要认为75%是“慢”的。毕竟,即使它在一纳秒内运行,也需要100%的时间。如果程序除了生成随机数之外什么都不做,那么您可能会认为这会占用大部分时间。然而,如果你想让它更快,它会告诉你去哪里看。我不是说它“慢”,但如果我想改进我的算法,这可能是我应该开始的地方。我总是要问-你是从
gprof
得到的吗?如果是这样的话,不要相信,因为
gprof
会忽略阻塞时间(如I/O)以及非pg编译库中占用的任何时间。如果你在某处写下这些数字,那很可能是实时的。你的“随机”数字应该是多少?如果您在基于Linux/glibc的系统上,您的问题是,
rand
实际上是按照
random
实现的,这是一种相当高质量(因此速度较慢)的PRNG。像纯LCG这样的低质量的应该快得多,但可能有足够糟糕的统计特性,使它们不适合您的应用程序。在大多数系统中,
rand()
是一个伪随机数生成器。我想知道他的实现到底有多慢。我想他们不会改变默认的实现,因为它会破坏预先设定的软件…现代的mersenne Twister与同等排名的备选方案相比真的没有那么快。我不确定这是否一定是个好主意,重复使用位可能无法保证他使用的最有可能的线性同余方法的周期。如果你想要高性能,模运算不是一个好主意。你从哪里得到的信息是,这比Kevin的机器的
rand()
实现更快?我刚刚测试过:1亿个数字需要1.2秒,rand()需要5秒。我必须检查它是否真的是随机的,但谢谢!它比rand()快一点。有一些角落案例,但没什么大不了的@JensGustedt和我的快乐kevinPIt使我的算法的时间减少了35%,结果类似。我想我会将您的fastrand与@Aaron Digulla答案结合起来,对其进行进一步改进。@KevinP:这是一个使用与Microsoft
rand()
实现相同参数的简单方法。它是快速的,但不是高质量的随机性。