2011-09-24 23 views
2

我想知道每種編程語言中的隨機函數是如何工作的,所以我想自己生成一個數字,即我不想使用任何內置的類或函數。在不使用任何內置函數的情況下在.NET中生成隨機數

+4

「我不想使用任何內置的類或函數。」爲什麼不?有關RNG如何工作,請參見[這裏](http://en.wikipedia.org/wiki/Random_number_generation)。你真的想在這裏依賴框架功能。 – CodeCaster

+0

請參閱http://en.wikipedia.org/wiki/Random_number_generation –

回答

4

爲了簡化和速度,它是很難被擊敗的Xorshift random number generator 。它是否產生了良好的分配是另一個問題。在C#

一個例子:http://www.codeproject.com/KB/cs/fastrandom.aspx

不同的語言和環境中使用不同的隨機數生成器。正如其他人所指出的,有很多方法可以生成僞隨機數。

請參閱C# Normal Random Number和其他類似堆棧溢出問題。

+1

*「是否產生良好的分配是另一個問題」*如果種子不好,情況就是如此。 Xorshift會產生一些你會看到的最漂亮的噪音,只要你在初始化過程中對種子進行哈希處理。這裏有一個比較LCG與Xorshift + Wang哈希的優秀文章。 http://www.reedbeta.com/blog/2013/01/12/quick-and-easy-gpu-random-numbers-in-d3d11/ –

4

如果你很好奇它是如何工作的,你可以從Wikipedia開始:Random number generationList of random number generators。第二個鏈接會給你一些你可以自己實現的流行算法(如Mersenne Twister)的列表。

您還可以使用.net反射反編譯System.Random並給出算法有什麼用D克努特本地實現在.net

此外,Art of Computer Programming比較對隨機數和他們這一代的一章。

+0

.Net中實際實施的BCL隨機支持,即MSIL?我會懷疑它是在本地完成的。 –

+0

是的,它是在.Net中實現的。他們生成1個數組(對每個Random對象),大約有50多個元素,並填充類似於我認爲的MWC的東西,然後返回此種子數組中的2個字段之間的差異,同時更新它的字段,所以它非常快對託管陣列的訪問很少)。 –

+1

@chibacity _「隨機類的當前實現基於Donald E. Knuth的減法隨機數生成器算法的修改版本。」_和'RNGCryptoServiceProvider正在使用本機['CryptGenRandom'](http:// msdn .microsoft.com/library/aa379942.aspx)函數。 – ordag

3

正如其他人所評論的那樣,您確實需要依賴於框架功能。如果這是出於學術目的或出於純粹的興趣,有很多易於實現的RNG算法。一是乘用進位(MWC)算法,可以在C#中可以輕鬆實現:

public class RNG 
{ 
    // Seeds 
    static uint m_w = 362436069; /* must not be zero */ 
    static uint m_z = 521288629; /* must not be zero */ 

    public int NextRandom() 
    { 
     m_z = 36969 * (m_z & 65535) + (m_z >> 16); 
     m_w = 18000 * (m_w & 65535) + (m_w >> 16); 
     return (int)((m_z << 16) + m_w); 
    } 
} 

有關MWC的詳細信息,請參閱http://www.bobwheeler.com/statistics/Password/MarsagliaPost.txt

相關問題