我想知道每種編程語言中的隨機函數是如何工作的,所以我想自己生成一個數字,即我不想使用任何內置的類或函數。在不使用任何內置函數的情況下在.NET中生成隨機數
回答
爲了簡化和速度,它是很難被擊敗的Xorshift random number generator 。它是否產生了良好的分配是另一個問題。在C#
一個例子:http://www.codeproject.com/KB/cs/fastrandom.aspx
不同的語言和環境中使用不同的隨機數生成器。正如其他人所指出的,有很多方法可以生成僞隨機數。
請參閱C# Normal Random Number和其他類似堆棧溢出問題。
*「是否產生良好的分配是另一個問題」*如果種子不好,情況就是如此。 Xorshift會產生一些你會看到的最漂亮的噪音,只要你在初始化過程中對種子進行哈希處理。這裏有一個比較LCG與Xorshift + Wang哈希的優秀文章。 http://www.reedbeta.com/blog/2013/01/12/quick-and-easy-gpu-random-numbers-in-d3d11/ –
如果你很好奇它是如何工作的,你可以從Wikipedia開始:Random number generation和List of random number generators。第二個鏈接會給你一些你可以自己實現的流行算法(如Mersenne Twister)的列表。
您還可以使用.net反射反編譯System.Random並給出算法有什麼用D克努特本地實現在.net
此外,Art of Computer Programming比較對隨機數和他們這一代的一章。
.Net中實際實施的BCL隨機支持,即MSIL?我會懷疑它是在本地完成的。 –
是的,它是在.Net中實現的。他們生成1個數組(對每個Random對象),大約有50多個元素,並填充類似於我認爲的MWC的東西,然後返回此種子數組中的2個字段之間的差異,同時更新它的字段,所以它非常快對託管陣列的訪問很少)。 –
@chibacity _「隨機類的當前實現基於Donald E. Knuth的減法隨機數生成器算法的修改版本。」_和'RNGCryptoServiceProvider正在使用本機['CryptGenRandom'](http:// msdn .microsoft.com/library/aa379942.aspx)函數。 – ordag
正如其他人所評論的那樣,您確實需要依賴於框架功能。如果這是出於學術目的或出於純粹的興趣,有很多易於實現的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
- 1. 如何在不使用rand()函數的情況下生成隨機數字?
- 2. 如何在不重複Swift的情況下生成隨機數
- 3. 在不重複的情況下生成範圍內的隨機數
- 4. 在不使用內置COUNT(*)函數的情況下執行COUNT
- 5. 如何在不重複統一的情況下生成隨機數據C#
- 6. 在隨機生成50個隨機數中使用隨機數#
- 7. C++在函數中生成隨機數
- 8. Python:如何在不使用eval的情況下動態生成函數參數
- 9. 如何在無限時間內使用隨機函數生成隨機圖像?
- 10. 隨機數生成使用srand()函數
- 11. 如何在不使用任何循環的情況下數數?
- 12. 如何在沒有相同編號的情況下生成隨機數
- 13. 在不使用內置函數的情況下在Python中列表切片?
- 14. 如何在不使用任何Java內置函數的情況下將數字轉換爲字符數組
- 15. 如何在不使用python中的random.uniform的情況下生成一個隨機實數(10.0)?
- 16. 在VHDL函數中生成隨機值
- 17. 在cuda內核中生成隨機數
- 18. 如何在PHP中記錄內置函數的使用情況?
- 19. 使用sed在隨機數行中生成隨機數
- 20. 在我的情況下生成隨機字符
- 21. 使用MATLAB函數在Simulink中生成隨機數
- 22. 如何在不使用內置函數的情況下預測KNN分類器
- 23. 在不使用模數或位操作的情況下以腳本語言生成隨機數
- 24. 在不同範圍內在Cuda內核中生成隨機數
- 25. 在小於O(N)的情況下生成N個準隨機數
- 26. 如何在不使用任何循環的情況下生成兩個變量的函數?
- 27. 在不使用任何內置函數的情況下對數字進行舍入,如果/ else
- 28. 在super.ViewDidLoad下生成一個隨機數
- 29. 如何在生成文件的範圍內生成隨機數?
- 30. 在不使用插件的情況下在wordpress中生成pdf
「我不想使用任何內置的類或函數。」爲什麼不?有關RNG如何工作,請參見[這裏](http://en.wikipedia.org/wiki/Random_number_generation)。你真的想在這裏依賴框架功能。 – CodeCaster
請參閱http://en.wikipedia.org/wiki/Random_number_generation –