我正在研究一种算法,它需要以尽可能快的速度生成数百万个数字。实际上,我发现我的算法的rand()函数占用了75%的处理时间。
所以我在找更快的东西。而且我根本不需要大范围。(我只需要1000以下的整数)
你知道我需要什么吗?
谢啦!
编辑:
我使用这个数字来洗牌少于1000个实体的组。
我发现了更多关于“快速兰特”的信息。还有SSE版本,它更快,一次生成4个数字。
https://software.intel.com/en-us/articles/fast-random-number-generator-on-the-intel-pentiumr-4-processor/
如果您使用的是Intel Ivy Bridge处理器,则可以使用RDRAND指令将随机数生成很好地卸载到硬件上。
这篇堆栈溢出文章讨论RDRAND的吞吐量。
您还可以确定处理器是否支持RDRAND并使用硬件卸载或回退到软件实现。
Mersenne-Twister算法是一种非常快速但平衡的伪随机数生成器。
这是一个示例实现:http://fmg-www.cs.ucla.edu/geoff/mtwist.html
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次,并记录每次模拟的标准偏差。我还记录了以毫秒为单