亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

O(1)中唯一(非重復)隨機數?

O(1)中唯一(非重復)隨機數?

O(1)中唯一(非重復)隨機數?我希望在0到1000之間生成唯一的隨機數,這些數字永遠不會重復(也就是說,6不會出現兩次),但這不需要使用O(N)搜索以前的值來實現。這個是可能的嗎?
查看完整描述

4 回答

?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

初始化值為0-1000的1001整數數組,并將變量max設置為數組的當前最大索引(從1000開始)。選擇一個隨機數,r,介于0和最大值之間,將位置r處的數字與位置max處的數字互換,然后在最大位置返回數字。最大減少1,然后繼續。當max為0時,將max設置為數組的大小,然后在不需要重新初始化數組的情況下重新啟動。

最新情況:雖然我在回答這個問題時自己想出了這個方法,但經過一些研究后,我意識到這是一個修改后的費舍-耶茨被稱為杜斯滕菲爾德-費舍-耶茨或Knuth-Fisher-Yates。由于描述可能有點難以理解,我提供了以下示例(使用11個元素而不是1001):

數組從初始化為數組[n]=n的11個元素開始,最大值從10開始:

+--+--+--+--+--+--+--+--+--+--+--+

| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|

+--+--+--+--+--+--+--+--+--+--+--+

                                ^

                               max    

在每次迭代時,在0和max之間選擇一個隨機數r,交換數組[r]和數組[max],返回新的數組[max],并減少max:


max = 10, r = 3

           +--------------------+

           v                    v

+--+--+--+--+--+--+--+--+--+--+--+

| 0| 1| 2|10| 4| 5| 6| 7| 8| 9| 3|

+--+--+--+--+--+--+--+--+--+--+--+


max = 9, r = 7

                       +-----+

                       v     v

+--+--+--+--+--+--+--+--+--+--+--+

| 0| 1| 2|10| 4| 5| 6| 9| 8| 7: 3|

+--+--+--+--+--+--+--+--+--+--+--+


max = 8, r = 1

     +--------------------+

     v                    v

+--+--+--+--+--+--+--+--+--+--+--+

| 0| 8| 2|10| 4| 5| 6| 9| 1: 7| 3|

+--+--+--+--+--+--+--+--+--+--+--+


max = 7, r = 5

                 +-----+

                 v     v

+--+--+--+--+--+--+--+--+--+--+--+

| 0| 8| 2|10| 4| 9| 6| 5: 1| 7| 3|

+--+--+--+--+--+--+--+--+--+--+--+


...

經過11次迭代后,選擇了數組中的所有數字,max=0,數組元素被洗牌:


+--+--+--+--+--+--+--+--+--+--+--+

| 4|10| 8| 6| 2| 0| 9| 5| 1| 7| 3|

+--+--+--+--+--+--+--+--+--+--+--+

此時,可以將最大值重置為10,并且進程可以繼續。


查看完整回答
反對 回復 2019-06-01
?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

你可以這樣做:

  1. 創建一個列表,0.1000。
  2. 洗牌。(見

    費舍-耶茨洗牌

    為了一個很好的方法來做這件事。)
  3. 從被洗牌的列表中按順序返回數字。

因此,這不需要每次搜索舊值,但對于初始洗牌仍然需要O(N)。但正如Nils在評論中所指出的,這是攤銷的O(1)。


查看完整回答
反對 回復 2019-06-01
?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

最大線性反饋移位寄存器.

它可以在幾行C中實現,在運行時,它只完成幾個測試/分支、一點點加法和位移位。這不是隨機的,但它愚弄了大多數人。


查看完整回答
反對 回復 2019-06-01
  • 4 回答
  • 0 關注
  • 960 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號