隨機數生成算法:K進制逐位生成+拒絕采樣

隨機數生成算法:K進制逐位生成+拒絕采樣

轉自:【宮水三葉】k 進制諸位生成 + 拒絕采樣

基本分析

給定一個隨機生成 1 ~ 7 的函數,要求實現等概率返回 1 ~ 10 的函數。

首先需要知道,在輸出域上進行定量整體偏移,仍然滿足等概率,即要實現 0 ~ 6 隨機器,只需要在 rand7 的返回值上進行 -1 操作即可。

但輸出域的 拼接/疊加 并不滿足等概率。例如 rand7() + rand7() 會產生 [2, 14] 范圍內的數,但每個數并非等概率:

  • 產生 2 的概率為:17×17=149\frac{1}{7}\times\frac{1}{7}=\frac{1}{49}71?×71?=491?
  • 產生 4 的概率為:17×17+17×17+17×17=349\frac{1}{7}\times\frac{1}{7}+\frac{1}{7}\times\frac{1}{7}+\frac{1}{7}\times\frac{1}{7}=\frac{3}{49}71?×71?+71?×71?+71?×71?=493?

在 [2,14] 這 13 個數中,等概率的數不足 10 個。

因此,你應該知道「執行兩次 rand7 相加,將 [1, 10] 范圍內的數進行返回,否則一直重試」的做法是錯誤的。

k進制逐位生成 + 拒絕采樣

上述做法出現概率分布不均的情況,是因為兩次隨機值的不同組合「相加」的會出現相同的結果,比如 (1, 3)、(2, 2)、(3, 1) 最終結果均為 4。

結合每次執行 rand7 都可以看作一次獨立事件。我們可以將兩次 rand7 的結果看作生成 7 進制的兩位。從而實現每個數值都唯一對應了一種隨機值的組合(等概率),反之亦然。

舉個例子,設隨機執行兩次 rand7 得到的結果分別是 4(第一次)、7(第二次),由于我們是要 7 進制的數,因此可以先對 rand7 的執行結果進行 -1 操作,將輸出域偏移到 [0,6](仍為等概率),即得到 3(第一次)和 6(第二次),最終得到的是數值 (63)7(63)_7(63)7? ,數值 (63)7(63)_7(63)7? 唯一對應了我們的隨機值組合方案,反過來隨機值組合方案也唯一對應一個 7 進制的數值。

那么根據「進制轉換」的相關知識,如果我們存在一個 randK 的函數,對其執行 nnn 次,我們能夠等概率產生 [0,Kn?1][0, K^n - 1][0,Kn?1] 范圍內的數值。

回到本題,執行一次 rand7 只能產生 [0,6] 范圍內的數值,不足 10 個;而執行 2 次 rand7 的話則能產生 [0, 48] 范圍內的數值,足夠 10 個,且等概率。

我們只需要判定生成的值是否為題意的 [1, 10] 即可,如果是的話直接返回,否則一直重試。

代碼:

class Solution {
public:int rand10() {while (1) {int r71 = rand7();int r70 = rand7();int val = (r71 - 1) * 7 + r70 - 1;if (val >= 1 && val <= 10) return val;}}
};
  • 時間復雜度:期望復雜度為 O(1),最壞情況下為 O(∞\infty)
  • 空間復雜度:O(1)

進階

降低對 rand7 的調用次數

我們發現,在上述解法中,范圍 [0, 48] 中,只有 [1, 10] 范圍內的數據會被接受返回,其余情況均被拒絕重試。

為了盡可能少的調用 rand7 方法,我們可以從 [0, 48] 中取與 [1, 10] 成倍數關系的數,來進行轉換。

我們可以取 [0, 48] 中的 [1, 40] 范圍內的數來代指 [1, 10]。

首先在 [0, 48] 中取 [1, 40] 仍為等概率,其次形如 x1 的數值有 4 個(1、11、21、31),形如 x2 的數值有 4 個(2、12、22、32)… 因此最終結果仍為等概率。

代碼:

class Solution {
public:int rand10() {while (1) {int r71 = rand7();int r70 = rand7();int val = (r71 - 1) * 7 + r70 - 1;if (val >= 1 && val <= 40) return val % 10 + 1;}}
};

時間復雜度:期望復雜度為 O(1),最壞情況下為 O(∞\infty)
空間復雜度:O(1)

計算 rand7 的期望調用次數

在 [0, 48] 中我們采納了 [1, 40] 范圍內的數值,即以調用兩次為基本單位的話,有 4049\frac{40}{49}4940? 的概率被接受返回(成功)。

成功的概率為 4049\frac{40}{49}4940? ,那么觸發成功所需次數(期望次數)為其倒數 4940=1.225\frac{49}{40} = 1.2254049?=1.225,每次會調用兩次 rand7,因而總的期望調用次數為 1.225?2=2.451.225 * 2 = 2.451.225?2=2.45

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532391.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532391.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532391.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解NLP Subword算法:BPE、WordPiece、ULM

深入理解NLP Subword算法&#xff1a;BPE、WordPiece、ULM 本文首發于微信公眾號【AI充電站】&#xff0c;感謝大家的贊同、收藏和轉發(▽) 轉自&#xff1a;深入理解NLP Subword算法&#xff1a;BPE、WordPiece、ULM 前言 Subword算法如今已經成為了一個重要的NLP模型性能提升…

http 錯誤 404.0 - not found_電腦Regsvr32 用法和錯誤消息的說明

? 對于那些可以自行注冊的對象鏈接和嵌入 (OLE) 控件&#xff0c;例如動態鏈接庫 (DLL) 文件或 ActiveX 控件 (OCX) 文件&#xff0c;您可以使用 Regsvr32 工具 (Regsvr32.exe) 來將它們注冊和取消注冊。Regsvr32.exe 的用法RegSvr32.exe 具有以下命令行選項&#xff1a; Regs…

mysql error 1449_MySql錯誤:ERROR 1449 (HY000)

筆者系統為 mac &#xff0c;不知怎的&#xff0c;Mysql 竟然報如下錯誤&#xff1a;ERROR 1449 (HY000): The user specified as a definer (mysql.infoschemalocalhost) does not exist一時沒有找到是什么操作導致的這個錯誤。然后經過查詢&#xff0c;參考文章解決了問題。登…

MobileNet 系列:從V1到V3

MobileNet 系列&#xff1a;從V1到V3 轉自&#xff1a;輕量級神經網絡“巡禮”&#xff08;二&#xff09;—— MobileNet&#xff0c;從V1到V3 自從2017年由谷歌公司提出&#xff0c;MobileNet可謂是輕量級網絡中的Inception&#xff0c;經歷了一代又一代的更新。成為了學習輕…

mysql 查詢表的key_mysql查詢表和字段的注釋

1,新建表以及添加表和字段的注釋.create table auth_user(ID INT(19) primary key auto_increment comment 主鍵,NAME VARCHAR(300) comment 姓名,CREATE_TIME date comment 創建時間)comment 用戶信息表;2,修改表/字段的注釋.alter table auth_user comment 修改后的表注…

mysql 高級知識點_這是我見過最全的《MySQL筆記》,涵蓋MySQL所有高級知識點!...

作為運維和編程人員&#xff0c;對MySQL一定不會陌生&#xff0c;尤其是互聯網行業&#xff0c;對MySQL的使用是比較多的。MySQL 作為主流的數據庫&#xff0c;是各大廠面試官百問不厭的知識點&#xff0c;但是需要了解到什么程度呢&#xff1f;僅僅停留在 建庫、創表、增刪查改…

teechart mysql_TeeChart 的應用

TeeChart 是一個很棒的繪圖控件&#xff0c;不過由于里面沒有注釋&#xff0c;網上相關的資料也很少&#xff0c;所以在應用的時候只能是一點點的試。為了防止以后用到的時候忘記&#xff0c;我就把自己用到的東西都記錄下來&#xff0c;以便以后使用的時候查詢。1、進制縮放圖…

NLP新寵——淺談Prompt的前世今生

NLP新寵——淺談Prompt的前世今生 轉自&#xff1a;NLP新寵——淺談Prompt的前世今生 作者&#xff1a;閔映乾&#xff0c;中國人民大學信息學院碩士&#xff0c;目前研究方向為自然語言處理。 《Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in…

mysql key_len_淺談mysql explain中key_len的計算方法

mysql的explain命令可以分析sql的性能&#xff0c;其中有一項是key_len(索引的長度)的統計。本文將分析mysql explain中key_len的計算方法。1、創建測試表及數據CREATE TABLE member (id int(10) unsigned NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,age tinyint(…

requestfacade 這個是什么類?_Java 的大 Class 到底是什么?

作者在之前工作中&#xff0c;面試過很多求職者&#xff0c;發現有很多面試者對Java的 Class 搞不明白&#xff0c;理解的不到位&#xff0c;一知半解&#xff0c;一到用的時候&#xff0c;就不太會用。想寫一篇關于Java Class 的文章&#xff0c;沒有那么多專業名詞&#xff0…

初學機器學習:直觀解讀KL散度的數學概念

初學機器學習&#xff1a;直觀解讀KL散度的數學概念 轉自&#xff1a;初學機器學習&#xff1a;直觀解讀KL散度的數學概念 譯自&#xff1a;https://towardsdatascience.com/light-on-math-machine-learning-intuitive-guide-to-understanding-kl-divergence-2b382ca2b2a8 解讀…

php mysql讀取數據查詢_PHP MySQL 讀取數據

PHP MySQL 讀取數據從 MySQL 數據庫讀取數據SELECT 語句用于從數據表中讀取數據:SELECT column_name(s) FROM table_name我們可以使用 * 號來讀取所有數據表中的字段&#xff1a;SELECT * FROM table_name如需學習更多關于 SQL 的知識&#xff0c;請訪問我們的 SQL 教程。使用 …

MySQL應用安裝_mysql安裝和應用

1.下載mysql安裝包2.安裝mysql&#xff0c;自定義->修改路徑3.配置mysql&#xff0c;選擇自定義->server模式->500訪問量->勾選控制臺->設置gbk->設置密碼和允許root用戶遠程登錄等等。以管理員權限&#xff0c;在控制臺輸入&#xff1a;net start MySQL, 啟…

mysql 商品規格表_商品規格分析

產品表每次更新商品都會變動的&#xff0c;ID不能用&#xff0c;可是購物車還是用了&#xff0c;這就導致每次保存商品&#xff0c;哪怕什么都沒有改動&#xff0c;也會導致用戶的購物車失效。~~~其實可以考慮不是每次更新商品就除所有的SKU&#xff0c;畢竟有時什么都沒修改呢…

mysql維表的代理鍵字段_mysql多維數據倉庫指南--第三篇第12章(2)

賓夕法尼亞州地區客戶維在本節我將用賓夕法尼亞州地區客戶的子集維度來解釋第二種維度子集的類型。我也將向你說明如何測試該子集維度。相對的&#xff0c;一個向上鉆取的維包含了它基礎維的所有更高級別的數據。而一個特定子集維度則選擇了它基礎維的某個特定的數據集合。列表…

huggingface NLP工具包教程1:Transformers模型

huggingface NLP工具包教程1&#xff1a;Transformers模型 原文&#xff1a;TRANSFORMER MODELS 本課程會通過 Hugging Face 生態系統中的一些工具包&#xff0c;包括 Transformers&#xff0c; Datasets&#xff0c; Tokenizers&#xff0c; Accelerate 和 Hugging Face Hub。…

mysql日期比較timestamp_Mysql中的Datetime和Timestamp比較(轉載)

mysql中用于表示時間的三種類型date, datetime, timestamp (如果算上int的話&#xff0c;四種) 比較容易混淆&#xff0c;下面就比較一下這三種類型的異同相同點都可以用于表示時間都呈字符串顯示不同點1.顧名思義&#xff0c;date只表示YYYY-MM-DD形式的日期&#xff0c;datet…

隱馬爾可夫模型HMM推導

隱馬爾可夫模型HMM推導 機器學習-白板推導系列(十四)-隱馬爾可夫模型HMM&#xff08;Hidden Markov Model&#xff09; 課程筆記 背景介紹 介紹一下頻率派和貝葉斯派兩大流派發展出的建模方式。 頻率派 頻率派逐漸發展成了統計機器學習&#xff0c;該流派通常將任務建模為一…

ef mysql 的坑_C# EF 與 MySql 的那些坑

之前一直想用 mysql 和 ef 。然后多次嘗試也只能感嘆 還是 sqlsever 是親兒子。今天在單位又嘗試了一次&#xff0c;然后就成功了&#xff0c;記錄一下遇到的問題。首先是安裝包和驅動&#xff1f;。請保證 MySql.Data / MySql.Data.Entity.EF6 / mysql Connector/NET 版本對應…

使用randomaccessfile類將一個文本文件中的內容逆序輸出_Java 中比較常用的知識點:I/O 總結...

Java中I/O操作主要是指使用Java進行輸入&#xff0c;輸出操作. Java所有的I/O機制都是基于數據流進行輸入輸出&#xff0c;這些數據流表示了字符或者字節數據的流動序列。數據流是一串連續不斷的數據的集合&#xff0c;就象水管里的水流&#xff0c;在水管的一端一點一點地供水…