【发布时间】:2022-01-04 21:45:26
【问题描述】:
在这个问题 How to get this PRNG to generate numbers within the range? 的基础上,我让它在 JavaScript 中支持 BigInt(大值),我 认为我做对了(如果我做错了,请纠正我):
const fetch = (x, o) => {
if (x >= o) {
return x
} else {
const v = (x * x) % o
return (x <= (o / 2n)) ? v : o - v
}
}
const fetchLarge = (x) => fetch(x, 43214321432143214321432143214321432143214321n)
// the last number can be anything.
const buildLarge = (x, o) => fetchLarge((fetchLarge(x) + o) % BigInt(Math.pow(32, 31)) ^ 101010101010104321432143214321n)
const j = 432143213214321432143214321432143214321n; // If you don't want duplicates, either i or j should stay fixed
let i = 1n
let invalid = [];
let valid = new Set;
while (i) {
let x = buildLarge(i, j);
if (valid.has(x)) {
invalid.push([i, j, x]);
} else {
valid.add(x);
}
console.log(x)
i++;
}
console.log("invalid:", invalid);
console.log("valid:", [...valid]);
console.log("count of valid:", valid.size);
旁注:永远不应该有 invalid 值。
但主要的问题是,给定一个x 的值,例如40531205068036774067539981357810868028938588n,如何将其划分为一个 5 位值数组(0-31 之间的整数数组)?
它就像x.toString(32) 然后将这些字母转换为索引一样简单吗?不确定我这样做是否正确。
【问题讨论】:
-
我是否正确理解您的最后一个问题并不真正取决于您提供的代码?
-
简单地反复用余数除以32?或者
toString(2)并分成 5 组… -
"就像
x.toString(32)然后将每个字母转换回数字一样简单吗?" - 是的,这也有效 -
好吧,部分原因是我可以将伪随机 bigint 正确转换为带有自定义字符的字符串。
-
如果你打算在浏览器中运行它,我建议使用
fetch以外的名称...
标签: javascript string bigint