C++有沒有比較好的辦法可以生成一個大亂數,范圍在0~INT_MAX之間,
重點是不重復生成,直到這個范圍內的每個數都被生成一遍為止?
uj5u.com熱心網友回復:
生成亂數太簡單了 用不著討論難點是避免重復 為了避免重復 你必須保存全部已經生成的資料
范圍太大 毫無取巧空間
32位程式 很難在記憶體范圍完成這個操作 哪怕使用位圖保存已經生成的資料
要么上64位程式 然后為所欲為
要么保存到其他外存 (檔案或者資料庫或者網路)
那么程式運行起來目測就會比較慢了
uj5u.com熱心網友回復:
把你原始的問題貼出來我感覺這個問題是你自己思考一半的成功
uj5u.com熱心網友回復:
大范圍不重復一般不會要求亂數比如 資料庫記錄序號 訊息序號
uj5u.com熱心網友回復:
原始問題是隨機寫滿全盤的問題:
一個最大容量可能是10T的盤,我要對其隨機寫滿,保證每個扇區只寫一次,固定每次寫的扇區數。
后續可能會需要每次寫的長度也是隨機。
這個是我目前遇到的需求,我不知道該怎么樣方便的實作,就想著用不重復的大亂數,您有什么更好的方法嗎
uj5u.com熱心網友回復:
補充一下問題:我這里面隨機寫滿盤的表述不是很準確,具體是給定一個起始扇區和一個操作長度,在這個起始扇區往后的操作長度內進行隨機寫滿,保證其中的每個扇區只寫一次,不重復。而這個操作長度可能是全盤大小,也就是全盤寫滿。
我想到的一個解決方法是用亂數引擎生成隨機地址,用hash表建立中間狀態,然后當隨機寫滿70%或80%后,跳出隨機,余下的直接順序寫滿。
第二個就是我先生成一個組態檔,將隨機生成的地址寫到檔案里,再讓軟體去讀這個地址。
但這兩種方法都需要建立中間程序存盤扇區狀態。
所以想要更好的方法。
uj5u.com熱心網友回復:
要隨機就不能保證不重復,保證不重復的不是隨機,而是洗牌uj5u.com熱心網友回復:
既然知道了隨機范圍,那就把該范圍放入一個集合,用集合的長度為種子隨機取集合的一個元素,并洗掉該集合的元素。重復這一程序,直到集合沒有元素。這樣,既能保證隨機,又能保證不重復。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/66532.html
標籤:C++ 語言
上一篇:C語言條件編譯出錯
下一篇:一個SSM專案從一臺電腦直接復制到另一臺電腦后啟動報no matching editors or conversion strategy found
