亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

解釋楊中科隨機數為什么會騙人?

2019-11-17 03:08:37
字體:
來源:轉載
供稿:網友

解釋楊中科隨機數為什么會騙人?

當你在Stack Overflow網站標題中看到“隨機”這個詞你基本可以確定這是相同的基本問題無數的相似問題。本文帶你探討為什么隨機性會引起這么多問題并且如何解決它們。

Stack Overflow (or newsgroup, or mailing list etc) )網站的問題通常是這樣的:

我使用Random.Next生成隨機數,但它一直給我相同的號碼。 它不停的運行,但每次它會產生相同數量很多次。

這是由于這樣的代碼:

  // Bad code! Do not use!         for (int i = 0; i < 100; i++)         {                   Console.WriteLine(GenerateDigit());         }         ....         static int GenerateDigit()         {                   Random rng = new Random();                   // Assume there'd be more logic here really                   return rng.Next(10);         }

那么,這程序到底出了什么問題?

1.解讀

這種Random類不是真正的隨機數發生器,它是一個偽隨機數發生器。任何Random實例都有一定量的狀態,而當你調用Next( or NextDouble or NextBytes),它會使用該狀態來返回到似乎是隨機的數據,相應的改變它內部狀態以便于在下一步調用時你將得到另一個偽隨機數。

所有的這一切都是確定的,如果你開始一個Random的實例以相同的初始狀態(可通過種子來提供),并使用相同的序列方法調用它,那你會得到相同的結果。

那么在我們的示例代碼中到底出了什么問題? 我們使用的一個新的Random實例也在循環迭代。隨機無參數的構造函數取當前日期和時間作為種子-在內部定時器工作之前你通??梢詧绦写罅看a,當前的日期和時間就會發生變化。 因此,我們重復使用相同的種子就會重復得到相同的結果。

2.對此我們能做什么?

這個問題有很多的解決方案, 其中有些方法是比其他的更好。 讓我們先挑出其中一種方法,因為它不同于其他的方法。

3.使用加密的隨機數發生器

  .NET有一個RandomNumberGenerator類應該是所有加密隨機數生成器派生而來的抽象類。 這個框架本身附帶了一個這樣的派生類: RNGCryptoServicePRovider 。 加密隨機數發生器的理念是,即使它可能仍然是一個偽隨機生成器,它還是很難做到不可預料。 內置的實現需要多個熵源在你的電腦有效地呈現“噪音”,并難以預測。它可以使用這種噪音不僅僅是計算一個種子,也可以在生成下一個數字時讓你知道當前的狀態,這也許可能不足以預測下一個結果(或者那些已經生成),這主要取決于具體的實施。Windows也可以利用專業硬件資源的隨機性(如一塊硬件觀察放射性同位素衰變),從而使得隨機數發生器更加安全。

  相比于這種隨機,如果你看到(說)10個結果調用Random.Next(100)并投入大量計算資源任務,你可能會制定出最初的種子并預知接下來的結果將是...很有可能也會知道之前的結果是什么。 如果這種隨機數應用于證券或金融的目的,這會是災難性的事態。 加密隨機數生成器通常比Random慢 ,但它在賦予數字難以預測和獨立方面做得更好。

  在很多情況下,隨機數生成器的性能不是一個問題-但有一個適當的API就會出現問題。 隨機數字生成器設計基礎僅此是用來生成隨機字節。比較這種API的隨機 ,它可以讓你請求一個隨機整數,或隨機double,或一組隨機字節。我經常發現我需要一個整數的范圍,得到可靠且一致地隨機字節數組是很重要的。這不是不可能,但至少你可能會想要一個適配器類在隨機數字生成器上。大多情況下,如果你能避免前面所述的陷阱,偽隨機性的Random是可以接受的。

  讓我們看看如何能做到這一點。

4.用一個復用的實例Random

對于“大量重復的數字”的修復程序的核心是重復使用同一個實例Random。 這聽起來很簡單...例如,我們可以改變我們這樣原始的代碼像這樣:

// Somewhat better code... Random rng = new Random();for (int i = 0; i < 100; i++) {     Console.WriteLine(GenerateDigit(rng)); } ...static int GenerateDigit(Random rng) {     // Assume there'd be more logic here really     return rng.Next(10); }

  現在,我們的循環會打印不同的數字......但我們還沒有完成。假如你在快速連續的時間內調用此代碼會發生什么? 我們可能仍然需要創建的兩個Random實例使用相同的種子......雖然數字的每個字符串將包含不同的數字,我們可以很容易得到的數字相同的字符串的兩倍。

  有兩種方式可以避免這個問題。 一種方式是使用一個靜態字段保持的單個實例Random被每一個對象使用。另外,我們可以推高實例,當然是最終達到計劃時,這永遠只能實例化一個單一的元素隨機性 ,并將其傳遞到任意地方。這是一個不錯的主意(和它所表達的依賴性很好),但它不會完全的工作......至少,如果你的代碼使用多個線程它會引發問題。

5.線程安全

  Random不是線程安全的。這是一個真正的痛處,因為考慮到我們觀念上是想在任何程序中如何使用單個實例。 但事實是,如果你從多個線程使用相同實例,它很可能以全零內部狀態結束,此時該實例變得無用。

  再次,在這里有兩種方法可以解決這個問題。其一是仍然使用一個實例, 而且使用的每個調用方必須記住他們所使用的隨機數生成器,同時獲得鎖。通過使用一個包裝器鎖定你就可以達到簡化的效果,但在一個高度多線程系統中你仍然有可能浪費大量的時間等待加鎖。

  在這里我們將學會另一種方法 - 是讓每個線程有一個實例。 我們需要確保,當我們創建實例時我們不要重復使用相同的種子(例如,所以我們不能只調用無參數的構造函數),但除此之外它是相對簡單的。

6.一個安全驅動

  很幸運的是,新ThreadLocal<T> .NET4類使得它很容易在每個線程需要單個實例中編寫提供者。 您只需給ThreadLocal<T>構造一個委托調用來獲得初始值當你不在的時候。 就我而言,我選擇使用一個單一的種子變量,初始化使用Environment.TickCount(就像參數的Random構造函數),然后每遞增,我們需要一個新的隨機數生成器的時間-這是每一次的線程。

  整個類是靜態的,只有一種公開方法: 隨機獲得線程 。這是一個方法而不是一個屬性大多為方便起見:而不是讓其中需要隨機數的類依賴于Random本身,他們會依賴于Func<Random> 。 如果這類型僅設計在單個線程中運行,它可以調用委托獲得的單個實例Random和重復使用; 假如它能夠從多個線程中每次使用調用委托它就需要一個隨機數發生器。 這將只會創造盡可能多的實例有線程,每個將使用不同的種子開始。 在依賴傳球的時候,我們就可以用一個方法轉換:

new TypeThatNeedsRandom(RandomProvider.GetThreadRandom) 下面的代碼:

using System;using System.Threading; public static class RandomProvider {        private static int seed = Environment.TickCount;         private static ThreadLocal<Random> randomWrapper = new ThreadLocal<Random>(() =>         new Random(Interlocked.Increment(ref seed))     );      public static Random GetThreadRandom()     {         return randomWrapper.Value;     } }

  很簡單,不是嗎? 這是因為它的所有關注的是提供正確的Random實例 。 它并不在乎你采用什么樣方法調用已經獲取的實例。 代碼仍然可以濫用這個類,當然,通過存放一個隨機引用并用多個線程重復使用它,但要做對的事還是很容易的。

7.界面設計問題

  一個問題仍然存在:這依舊不是很安全的。 正如我前面提到的,最常用的派生類是RNGCryptoServiceProvider,還有一個更安全隨機數字發生器的版本,然而這個API在一般情況下還是很難使用。

  假如框架驅動已經從“我想以簡單的方法得到一個隨機值”的概念中分離概念的“隨機性源”,這確實是令人非常愉快的。 然后我們可以根據需要使用一個簡單的API來支持一個安全的或不安全的隨機源,很不幸的是,還沒有這樣的方法。也許在將來的迭代中......或者有個第三方會想出一個適配器來代替。(可惜這在我能力之上,很好地做好這件事情是相當困難的。)你幾乎可以輕松成功地派生隨機和覆蓋示例及下個字節 ......但目前還不清楚他們需要如何工作,甚至Sample可能會非常棘手。 也許下一次...

  這是一篇國外的文章,被我翻譯過來。原文地址:http://csharpindepth.com/Articles/Chapter12/Random.aspx

  接受批評指正,拒絕無腦噴糞。


上一篇:C#刪除圖片問題

下一篇:C# Sqlite事務

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品电影在线| 亚洲精品国产拍免费91在线| 欧美黑人巨大精品一区二区| 欧美日本精品在线| 啊v视频在线一区二区三区| 亚洲国产精品热久久| 91精品久久久久久久久久久久久久| 亚洲自拍偷拍色片视频| 91精品国产91久久久久久吃药| 韩国19禁主播vip福利视频| 韩国日本不卡在线| 欧美精品videofree1080p| 亚洲第一视频在线观看| 亚洲精品丝袜日韩| 久久久99久久精品女同性| 国产婷婷成人久久av免费高清| 国产成人自拍视频在线观看| 久久97久久97精品免视看| 日韩成人中文电影| 久久久久久国产精品三级玉女聊斋| 成人看片人aa| 亚洲女人被黑人巨大进入| 精品夜色国产国偷在线| 亚洲最大福利网| 韩国19禁主播vip福利视频| 91九色蝌蚪国产| 91久久综合亚洲鲁鲁五月天| 欧美精品在线视频观看| 精品久久久精品| 亚洲一区二区三区sesese| 国产精品免费看久久久香蕉| 色综合亚洲精品激情狠狠| 国产精品久久久av久久久| 欧美性xxxx极品高清hd直播| 亚洲性生活视频| 国产精品视频不卡| 亚洲精品v天堂中文字幕| 精品久久久久久久中文字幕| 久久免费视频这里只有精品| 久久久久久国产精品三级玉女聊斋| 日本高清视频精品| 亚洲一区二区三区四区在线播放| 久久综合电影一区| 国产综合视频在线观看| 成人xxxx视频| 国产欧美精品在线播放| 久久偷看各类女兵18女厕嘘嘘| 欧美精品情趣视频| 国产在线精品一区免费香蕉| 日韩视频第一页| 日韩av免费看网站| 亚洲一区二区免费在线| 91在线看www| 久久久国产影院| 高清视频欧美一级| 国产精品久久综合av爱欲tv| 亚洲国产精品成人va在线观看| 日韩电影免费在线观看中文字幕| 日韩福利在线播放| 欧美成人自拍视频| 91av视频在线观看| 欧美精品videosex牲欧美| 91色视频在线导航| 亚洲成成品网站| 亚洲精品国产拍免费91在线| 日韩av影院在线观看| 亚洲资源在线看| 日韩性生活视频| 98视频在线噜噜噜国产| 日韩大片免费观看视频播放| 日韩成人中文字幕| 亚洲第一在线视频| 一区二区三区日韩在线| 国产亚洲一区二区精品| 国产一区二区三区高清在线观看| 国产精品福利观看| 久久夜色精品国产亚洲aⅴ| 亚洲自拍偷拍视频| 欧美成人精品一区二区| 日韩精品极品在线观看播放免费视频| 91亚洲午夜在线| 欧美性少妇18aaaa视频| 97国产成人精品视频| 欧美成人性色生活仑片| 亚洲精品福利在线| 法国裸体一区二区| 欧美成人小视频| 久久黄色av网站| 一级做a爰片久久毛片美女图片| 欧美精品在线极品| 日韩经典一区二区三区| 51精品在线观看| 九九热精品在线| 日韩三级影视基地| 国产啪精品视频| 亚洲精品国产精品乱码不99按摩| 亚洲欧美另类在线观看| 日韩欧美亚洲范冰冰与中字| 欧美日韩高清在线观看| 97视频在线看| 久久伊人精品视频| 国产精品福利无圣光在线一区| 国产97在线视频| 亚洲午夜激情免费视频| 2019中文字幕在线观看| 欧美日韩免费网站| 日韩精品亚洲视频| 国产精品视频永久免费播放| 亚洲激情中文字幕| 成人精品久久久| 久久躁狠狠躁夜夜爽| 久久久亚洲国产| 日韩av色在线| 午夜欧美不卡精品aaaaa| 精品福利免费观看| 欧美日韩成人免费| 亚洲精品不卡在线| 亚洲人成人99网站| 91精品国产高清久久久久久91| 热99久久精品| 亚洲自拍偷拍第一页| 国产视频在线一区二区| 狠狠久久五月精品中文字幕| 91高潮在线观看| 国产suv精品一区二区| 国产综合香蕉五月婷在线| 亚洲伊人久久大香线蕉av| 在线午夜精品自拍| 欧美国产日韩视频| 亚洲深夜福利网站| 成人美女免费网站视频| 日韩av在线直播| 欧美精品在线极品| 91成人国产在线观看| 91美女片黄在线观| 精品国产美女在线| 欧美一级淫片videoshd| 精品高清一区二区三区| 国产精国产精品| 亚洲男人的天堂网站| 久久久国产精品视频| 国模极品一区二区三区| 在线观看欧美成人| 国产精品成人免费视频| 欧美激情一级欧美精品| 韩国三级日本三级少妇99| 欧美日韩国产麻豆| 欧美成人在线网站| 亚洲女人被黑人巨大进入| 成人网在线免费看| 国产精品影片在线观看| 欧美综合一区第一页| 久久久久这里只有精品| 久久久影视精品| 2018中文字幕一区二区三区| 成人免费网站在线看| 国产精品久久久久久久久久免费| 精品美女国产在线| 亚洲天堂av在线免费| 亚洲精品日韩在线| 久久亚洲电影天堂| 亚洲精品久久久久久下一站| 日韩av电影免费观看高清| 一本一本久久a久久精品牛牛影视|