【发布时间】:2017-10-19 13:52:33
【问题描述】:
我想将现有的基于随机数的数据生成器(在 Python 中)替换为基于哈希的数据生成器,这样它就不再需要按照 this article 的启发按顺序生成所有内容。
我可以通过取散列的整数版本并将其除以散列的最大值来创建一个从 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 变换将均匀分布的变量变为正态变量。 en.wikipedia.org/wiki/Box%E2%80%93Muller_transform
-
@ReblochonMasque 因为我想让数据生成器对属性生成顺序的更改具有鲁棒性。
-
仍然不清楚原因(我无法将第一句话映射到关于原因的最后一条评论;更不用说理解其中任何一个了)。如果做对了(位 -> 浮动),这也可能比您想做的工作更多。
-
您能否展示一些简单的代码来演示如何使用此功能?