【问题标题】:Convert 7 character Integer to Number between 0 and 100将 7 个字符的整数转换为 0 到 100 之间的数字
【发布时间】:2017-10-15 23:01:24
【问题描述】:

我目前正在尝试实现一个函数,将 64 个字符的随机十六进制哈希转换为 0 到 100 之间的数字。到目前为止,我有以下代码:

// Random hash
hash = 'f0ca70ef5e3942314d577ad32002d247cc28f0b503f775a0af2475917867708e';

function getResolvedTicket(hash) {
    let resolvedDecimal = parseInt(hash.substr(-6), 16);
    console.log(resolvedDecimal); // this always prints out a 7 character int, in this case '6779022'

    // Do something with resolvedDecimal to convert is to a number between 0 and 100 (with 2-3 decimals)
}

有什么优雅的方法可以做到这一点?

编辑

我基本上使用这个可证明公平的系统,只是没有随机数:https://thebitcoinstrip.com/a-guide-to-provable-fairness-in-online-casinos/ 如果有人有兴趣阅读这个:)

【问题讨论】:

  • 是否包含0100?您需要完全均匀的分布吗?
  • 转换的目的是什么?这些数字需要是唯一的还是随机的?如果两个不同的哈希生成相同的数字,这有关系吗?您应该更深入地解释问题,因为可能会有更好的整体方法。
  • 目的是为一个小型赌博网站提供一个可证明公平的系统。这些数字对于哈希来说必须是唯一的,所以每次我在哈希上使用 getResolvedTicket 函数时,它都应该吐出同一张票。如果不同的哈希生成相同的数字是可以的。
  • 每当创建散列时,使用散列作为查找键存储 0-100 之间的随机数
  • 另外,如果票号是可预测的,知道哈希值,是否可以?

标签: javascript node.js math


【解决方案1】:

模运算的问题在于结果不会是一致的。一些票号会比其他票号更频繁地被选中。

如果需要统一的结果,最好的方法可能是使用哈希作为种子来提供您自己的 PRNG,例如 Mersenne Twister

使用上面链接中提供的代码,将获得最佳结果:

Math.floor(MersenneTwister.genrand_res53() * 101)

genrand_res53()[0,1) 中以 53 位分辨率给出浮点数。

【讨论】:

  • 它是一个学校项目,所以我认为它已经足够好了。还是谢谢你指出!
【解决方案2】:

回答

function getResolvedTicket(hash) {
  let resolvedDecimal = parseInt(hash.substr(1, 5), 16);
  let ticket = resolvedDecimal%(100000)/1000;
  return ticket;
}

将哈希的前 5 个字符转换为十进制,然后除以 100000,然后将模数除以 1000。现在总是得到 3 个小数的票。

其实很容易解决,一旦我把头绕过去 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 2012-06-28
    • 2013-12-24
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2020-05-28
    相关资源
    最近更新 更多