【问题标题】:Converting an arbitrary seed into a float between 0 and 1将任意种子转换为 0 到 1 之间的浮点数
【发布时间】:2016-04-05 00:17:20
【问题描述】:

我希望能够将任何包含任何 utf-8 的字符串更改为 0 到 1 之间的随机数。

我可以使用以下数字转换任何种子:

Math.abs(Math.sin(seed));

由此我可以生成一个伪种子Math.random()-like 数字。

所以它将字符串转换为数字。我研究了使用加密,发现对字符串进行摘要是可行的,但速度非常慢,而且有点矫枉过正。

关于如何实现这一点的任何想法?

【问题讨论】:

  • crypto.randomBytes()开头。
  • 你知道Math.sin()会给你一个偏向1的分布吗? (还是故意的?)
  • @duskwuff 以何种方式向 1 倾斜?
  • @BrandonSmith sin(x) 的导数在 sin(x) 接近 0 时最大,在接近 ±1 时最小;这意味着它最终花费更少的“时间”接近于零。
  • @duskwuff 非常有趣。你能推荐一个我可以使用的替代方案吗?

标签: javascript node.js random cryptography random-seed


【解决方案1】:

使用 String.prototype.charCodeAt() 可以生成整数表示:

function stringToSeed(str){
  var values = [];
  for (var i = 0, len = str.length; i < len; i++) {
    values.push(str.charCodeAt(i));
  }
  // concatenatte and coerce to integer 
  return values.join('') + 0;
}

var seed = stringToSeed(string);

然后你可以像以前一样把这个种子传给罪。

串联而不是简单地添加值背后的想法是确保将随机性考虑在内,否则例如“AB”和“BA”会产生相同的值。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2016-11-29
    • 2012-06-28
    • 2019-07-19
    • 2014-09-22
    • 2011-07-07
    • 2016-06-19
    相关资源
    最近更新 更多