Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将7个字符的整数转换为0到100之间的数字_Javascript_Node.js_Math - Fatal编程技术网

Javascript 将7个字符的整数转换为0到100之间的数字

Javascript 将7个字符的整数转换为0到100之间的数字,javascript,node.js,math,Javascript,Node.js,Math,我目前正在尝试实现一个函数,该函数将包含64个字符的随机十六进制哈希值转换为0到100之间的数字。到目前为止,我有以下代码: // Random hash hash = 'f0ca70ef5e3942314d577ad32002d247cc28f0b503f775a0af2475917867708e'; function getResolvedTicket(hash) { let resolvedDecimal = parseInt(hash.substr(-6), 16);

我目前正在尝试实现一个函数,该函数将包含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)
}
这样做的优雅方式是什么

编辑

我基本上使用的是这个可证明公平的系统,只是没有暂时性: 如果有人感兴趣,请阅读以下内容:)

回答 将散列的前5个字符转换为十进制,然后除以100000,然后将模数除以1000。现在总是得到一张小数点为3的票


实际上,只要我仔细考虑一下,这个问题就很容易解决:)

模运算的问题是结果不一致。一些车票号码将比其他车票号码更频繁地被挑选

如果需要统一的结果,最好的方法可能是使用散列作为种子来为您自己的PRNG(例如)提供数据

使用上述链接中提供的代码,通过执行以下操作将获得最佳结果:

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

其中
genrand\u res53()
[0,1)
具有53位分辨率。

包括
0
100
吗?您需要一个完全均匀的分布吗?转换的目的是什么?数字需要是唯一的还是随机的?如果两个不同的哈希生成相同的数字会有关系吗?您应该尽可能深入地解释这个问题一个更好的整体方法。目的是为一个小型赌博网站提供一个可证明公平的系统。数字必须是散列唯一的,因此每次我在散列上使用getResolvedTicket函数时,它都应该吐出相同的票证。如果不同的散列生成相同的数字就可以了。每当创建散列时,在我们之间存储一个随机数en 0-100使用散列作为查找键同样,如果票证号码是可预测的,知道散列可以吗?这是一个学校项目,所以我认为它足够好了。仍然感谢您指出!
function getResolvedTicket(hash) {
  let resolvedDecimal = parseInt(hash.substr(1, 5), 16);
  let ticket = resolvedDecimal%(100000)/1000;
  return ticket;
}