如何在Python中生成伪随机数时解决这个问题?

问题描述 投票:0回答:2
import hashlib
import time
def random():
    hashtime = str(int(time.time() * (10 ** 6)))
    encoded = hashlib.new("sha3_512", hashtime.encode())
    decoded = int(encoded.hexdigest(), 16)
    
    dcsmall = decoded / (10 ** (len(str(decoded))))
    return (dcsmall)

我试过这段代码来模拟函数 random.random() 没有模块随机。我想生成一个介于 0 和 1 之间的随机数,但由于“解码”的长度,此代码不会输出介于 0 和 0.1 之间的数字,我不知道如何修复它。 请不要对我的代码进行巨大的更改,而是给我一个解决问题的想法。 谢谢

python random time hash
2个回答
0
投票

你的解码值范围和你的除法分母不一致。一个是二进制值,另一个是基于十进制的。结果分数的潜在范围不能为 0...1,因为

decode
的最大值与其字符串表示形式的位数不匹配。

您需要做的是取一大块值,您可以在其中强制或确定

decode
的最小和最大范围。我建议使用
decode
值的模并使用相同的分母来获得 0...1 分数:

dcsmall = decoded%2**64 / 2**64

0
投票

这可能会做到:

import hashlib
import time

def random():
    hashtime = str(int(time.time() * (10 ** 6)))
    encoded = hashlib.new("sha3_512", hashtime.encode())
    decoded = int(encoded.hexdigest(), 16)
    
    dcsmall = decoded / (2 ** 512)
    return (dcsmall)

SHA3-512 哈希为 512 位长——无需担心它们在十进制或十六进制表示法中的长度。

© www.soinside.com 2019 - 2024. All rights reserved.