生成随机数而不使用内置函数

时间:2014-08-03 05:41:45

标签: java c# c++ vb.net vb6

我正在生成内置函数的片段以了解它们的执行方式,也是我研究的一部分。我成功地完成了一些字符串处理函数,分割,子字符串,反向等等。但我在随机数中插入了它们如何生成软件? RNDRandom功能如何运作?

提前致谢

3 个答案:

答案 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

但我使用了一些不同的简化公式:

gauss

它表示从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;特定语言使用的算法各不相同,并非如此。