我想用基於散列的數據生成器(以Python)替換現有的基於隨機數的數據生成器,以便它不再需要按順序生成所有內容,如this article的啓發。我應該如何從基於PRNG的生成轉移到基於散列的程序生成?
我可以通過取整數版本的哈希值並將其除以哈希值的最大值來創建一個從0到1的浮點數。
我可以創建一個平坦的整數範圍,將浮點數乘以平坦範圍。我大概可以使用模和生活的偏見,因爲散列範圍很大,我的範圍很小。
我怎樣才能使用哈希來創建一個高斯或正態分佈式浮點值?
對於所有這些情況,我最好是使用我的散列作爲一個新的random.Random對象的種子,並使用該類中的函數來生成我的數字並依靠它們來獲得分配特性?
目前,我的代碼的結構是這樣的:
num_people = randint(1,100)
people = [dict() for x in range(num_people)]
for person in people:
person['surname'] = choice(surname_list)
person['forename'] = choice(forename_list)
的問題是,對於一個給定的種子是一致的,我一定要產生相同的順序所有的人,我不得不生成姓氏,然後生成姓氏。如果我在兩者之間添加一箇中間名,那麼生成的名字將會改變,所有後續人的所有名字也會改變。
我想構建這樣的代碼:
h1_groupseed=1
h2_peoplecount=1
h2_people=2
h4_surname=1
h4_forename=2
num_people = pghash([h1_groupseed,h2_peoplecount]).hashint(1,100)
people = [dict() for x in range(num_people)]
for h3_index, person in enumerate(people,1):
person['surname'] = surname_list[pghash([h1_groupseed,h2_people,h3_index,h4_surname]).hashint(0, num_of_surnames - 1)]
person['forename'] = forename_list[pghash([h1_groupseed,h2_people,h3_index,h4_forename]).hashint(0, num_of_forenames - 1)]
這將使用傳遞給pghash生成哈希值,並使用該散列以某種方式建立的僞隨機結果。
你爲什麼要這麼做? –
您可以使用Box Muller轉換將均勻分佈的變量更改爲普通變量。 https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform – WNG
@ReblochonMasque因爲我想讓數據生成器對屬性生成順序的更改具有魯棒性。 – PhilHibbs