首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在<u64>中获取随机AssemblyScript整数

在<u64>中获取随机AssemblyScript整数
EN

Stack Overflow用户
提问于 2022-11-17 19:32:45
回答 1查看 66关注 0票数 0

AsemblyScript书中,它提到Math.random()接受一个种子并返回一个<f64>值。我只需要一个随机的<u64>值。我怎么才能做到呢?

我试过了

代码语言:javascript
复制
(Math.random() * 0xffffffffffffffff) as u64
<u64>(<f64>Math.random() * <f64>0xffffffffffffffff)
(<f64>Math.random() * <f64>0xffffffffffffffff) as u64

或者用f64.MAX_VALUE代替0xffffffffffffffff之类的。

但我一直得到0。

我可以得到<U32>随机值,但是当我把两个<U32>随机值相乘时,我得到了52个随机比特,剩下的是0。我理解为什么这发生在我的JS背景中,仍然来自于类型化的结构和低级抽象,因为我希望没有摩擦。

如何正确地用<u64>获得一个AssemblyScript随机整数?

编辑:

我想我终于把它做得像

代码语言:javascript
复制
(<u64>(Math.random() * u32.MAX_VALUE) << 32) | <u32>(Math.random() * u32.MAX_VALUE)

但这是否真的应该这样做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-27 03:37:47

在阅读了您的问题之后,我决定研究AssemblyScript是如何在标准库中实现Math.random的,看看我是否能够得到一些灵感来解决您的问题。

有趣的是,它似乎使用了murmurhash3和一些定制的额外散列。在返回之前,经过一些额外的处理,它将u64值重新解释为f64

代码语言:javascript
复制
    let r = (s0 >> 12) | 0x3FF0000000000000;
    return reinterpret<f64>(r) - 1;

我很好奇是否可以将这个u64值作为随机序列中的一个数字直接使用,因此我重新处理了所涉及的比特,并将其发布到github 这里上,但主要功能是:

代码语言:javascript
复制
export function randomU64(): u64 { // see: v8/src/base/utils/random-number-generator.cc
  if (!random_seeded) seedRandom(reinterpret<i64>(0)); // TODO: for now, the seed is always 0.
  let s1 = random_state0_64;
  let s0 = random_state1_64;
  random_state0_64 = s0;
  s1 ^= s1 << 23;
  s1 ^= s1 >> 17;
  s1 ^= s0;
  s1 ^= s0 >> 26;
  random_state1_64 = s1;
  return s0;
}

一个非常简短的测试表明,至少一眼,它产生了相当好的随机结果:

代码语言:javascript
复制
Test randomU64 distribution. All values should be fairly close.
Map(19) {
  0n => 987,
  1n => 495, -1n => 515, 2n => 542, -2n => 489,
  3n => 518, -3n => 495, 4n => 479, -4n => 510,
  5n => 513, -5n => 497, 6n => 473, -6n => 505,
  7n => 468, -7n => 528, 8n => 501, -8n => 472,
  9n => 519, -9n => 494
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74481138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档