当前位置: 首页 > 知识库问答 >
问题:

比rand()快?

岳刚洁
2023-03-14

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

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

你知道我需要什么吗?

谢啦!

编辑:

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

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

https://software.intel.com/en-us/articles/fast-random-number-generator-on-the-intel-pentiumr-4-processor/

共有3个答案

康恩
2023-03-14

如果您使用的是Intel Ivy Bridge处理器,则可以使用RDRAND指令将随机数生成很好地卸载到硬件上。

这篇堆栈溢出文章讨论RDRAND的吞吐量。

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

冯浩旷
2023-03-14

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

这是一个示例实现:http://fmg-www.cs.ucla.edu/geoff/mtwist.html

戚飞
2023-03-14
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;
}
 类似资料:
  • 描述 (Description) 此函数返回0到正数EXPR之间的随机小数,如果未指定,则返回1。 除非已经调用了随机数生成器,否则自动调用srand来播种随机数生成器。 语法 (Syntax) 以下是此函数的简单语法 - rand EXPR rand 返回值 (Return Value) 此函数返回浮点数。 例子 (Example) 以下是显示其基本用法的示例代码 - #!/usr/bin/p

  • rand(产生随机数) 相关函数 srand,random,srandom 表头文件 #include<stdlib.h> 定义函数 int rand(void) 函数说明 rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。关于随机数种子请参考srand()

  • import "math/rand" rand包实现了伪随机数生成器。 随机数从资源生成。包水平的函数都使用的默认的公共资源。该资源会在程序每次运行时都产生确定的序列。如果需要每次运行产生不同的序列,应使用Seed函数进行初始化。默认资源可以安全的用于多go程并发。 Example rand.Seed(42) // Try changing this number! answers := []st

  • import "crypto/rand" rand包实现了用于加解密的更安全的随机数生成器。 Variables func Int(rand io.Reader, max *big.Int) (n *big.Int, err error) func Prime(rand io.Reader, bits int) (p *big.Int, err error) func Read(b []byte)

  • rand 产生随机数 相关函数 srand,random,srandom 表头文件 #include<stdlib.h> 定义函数 int rand(void); 函数说明 rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。关于随机数种子请参考srand

  • 但是,我想直接看到的缺点,所以我做了一个快速的实验: 基本上,我编写了两个函数和,它们分别使用和+生成0和5之间的随机数。 然后我用“老”的方式生成了960,000个(可被6整除)随机数,并记录了数字0-5的频率。然后我计算了这些频率的标准差。我所寻找的是一个尽可能低的标准偏差,因为如果分布是真正均匀的,那么就会发生这种情况。 我运行该模拟1000次,并记录每次模拟的标准偏差。我还记录了以毫秒为单