我目前正在尝试实现一个将64位字符的随机十六进制哈希值转换为0到100之间的数字的函数。到目前为止,我有以下代码:
#convert first or second to str or int
#MergeDat['Motor'] = MergeDat['Motor'].astype(str)
Motor['Motor'] = Motor['Motor'].astype(str)
MergeDat['Motor'] = MergeDat['Motor'].astype(int)
#Motor['Motor'] = Motor['Motor'].astype(int)
MergeDat=MergeDat.merge(Motor,how="left")
这样做的优雅方法是什么?
修改:
我基本上使用这个可证明公平的系统,只是没有现时:https://thebitcoinstrip.com/a-guide-to-provable-fairness-in-online-casinos/ 如果有人有兴趣,请阅读:)
答案 0 :(得分:1)
模运算的问题在于结果不一致。有些票号会比其他票号更频繁地被选中。
如果需要统一的结果,最好的方法可能是使用哈希作为种子来提供自己的PRNG,例如Mersenne Twister。
使用上述链接中提供的代码,可以通过以下方式获得最佳结果:
Math.floor(MersenneTwister.genrand_res53() * 101)
其中genrand_res53()
在[0,1)
中给出了一个53位分辨率的浮点数。
答案 1 :(得分:0)
function getResolvedTicket(hash) {
let resolvedDecimal = parseInt(hash.substr(1, 5), 16);
let ticket = resolvedDecimal%(100000)/1000;
return ticket;
}
将哈希的前5个字符转换为十进制,然后除以100000,然后将模数除以1000.现在总是得到一个包含3位小数的票证。
一旦我绕过它,实际上很容易解决:)