我正在生成内置函数的片段以了解它们的执行方式,也是我研究的一部分。我成功地完成了一些字符串处理函数,分割,子字符串,反向等等。但我在随机数中插入了它们如何生成软件? RND
或Random
功能如何运作?
提前致谢
答案 0 :(得分:2)
最流行的当前算法可能是维基百科文章中的Mersenne twister伪代码(并且Google提供了许多实现)。
另一个众所周知的算法是Blum Blum Shub,它有一个证明可以减少其算法的证据。计算模块化平方根的计算难度的安全性,这个问题的难度被认为等同于因子分解。但是Blum Blum Shub很慢。
最后,here是一个很大的附加伪随机数生成器列表。特定语言使用的算法各不相同。
答案 1 :(得分:2)
这是我在一些项目中经常使用的两种算法:
1.统一分布的数字,范围在0到1之间
result = getRidOfIntegerPart(A * prevResult)
A 是种子。
可能的实现(C ++):
int main()
{
double A = 12.2345; //seed
double prevResult = 1; //You can assign any value here
double result;
double intPart;
//This will give you 10 uniform distributed numbers
for(unsigned i = 0; i < 10; ++i)
{
double r = A * prevResult;
result = modf(r, &intPart); // To get rid of integer part
prevResult = result;
cout<<"result "<<i<<" = "<<result<<endl;
}
}
<强> 2。正常(高斯)分布
这是一个原始公式: http://en.wikipedia.org/wiki/Normal_distribution
但我使用了一些不同的简化公式:
它表示从12个均匀分布数(Sj
)
可能的实现(C ++):
class RandomNumberGenerator
{
public:
RandomNumberGenerator()
{
uniformPrevResult = 1;
uniformResult = 0;
uniformIntPart = 0;
}
double generateUniformNumber(double seed)
{
double r = seed * uniformPrevResult;
uniformResult = modf(r, &uniformIntPart); // To get rid of integer part
uniformPrevResult = uniformResult;
return uniformResult;
}
double generateNormalNumber(double seed)
{
double uniformSum = 0;
for(unsigned i = 0; i < 12; ++i)
{
uniformSum += generateUniformNumber(seed);
}
double normalResult = uniformSum - 6;
return normalResult; // 6 is a magic number
}
private:
double uniformPrevResult;
double uniformResult;
double uniformIntPart;
};
int main()
{
const double seed = 12.2345;
RandomNumberGenerator rndGen;
for(unsigned i = 0; i < 100; ++i)
{
double newNormalNumber = rndGen.generateNormalNumber(seed);
cout<<"newNormalNumber = "<<newNormalNumber<<endl;
}
return 0;
}
我希望它能帮到你!
答案 2 :(得分:1)
JAva语言使用java.util.Random中记录的算法。在那里它还指出所有实现必须使用此算法
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
return (int)(seed >>> (48 - bits));
因此,对于Java而言,#34;特定语言使用的算法各不相同,并非如此。