【问题标题】:Predictable Javascript array shuffle [duplicate]可预测的Javascript数组洗牌[重复]
【发布时间】:2015-03-31 03:29:48
【问题描述】:

我试图在每次加载网页时以相同的方式对 javascript 数组进行可预测的洗牌。

我可以随机打乱数组,但每次我重新加载页面时都是不同的顺序。

我希望它在每次页面加载时都以相同的方式对数组进行洗牌。有许多数组,它们是程序生成世界的一部分。

【问题讨论】:

  • 存储在本地存储中
  • 为它写一个不那么随意的脚本。
  • 谢谢 adeneo,但作为世界选项的一部分,用户可以擦除本地存储。所以我想要一些每次都运行相同的硬代码。
  • 程序生成器不是通常用种子值初始化,以便随机生成器每次都产生相同的一系列值吗?
  • 谢谢 - 是的,但我无法将世界生成器应用于 javascript 数组。我再看看能不能弄明白。

标签: javascript arrays random repeat


【解决方案1】:

看看chancejs.com's seed函数。

【讨论】:

  • 谢谢比利·穆恩。 Chance.js 运行良好。 var 机会 1 = 新机会(124); // 你可以在这里选择种子,我选择了 124 console.log(chance1.shuffle(['alpha', 'bravo', 'charlie', 'delta', 'echo'])); // 数组 [ "alpha", "delta", "echo", "charlie", "bravo" ]
  • @Protopop 是的 - chance.js 非常聪明,并且对许多其他事情也很有用 - 尤其是在测试中的可重复性方面。
【解决方案2】:

Chance.js 完美运行。谢谢比利·穆恩。

我的例子:

<script type="text/javascript" src="assets/js/chance.js"></script>

var chance1 = new Chance(124); // you can choose a seed here, i chose 124
console.log(chance1.shuffle(['alpha', 'bravo', 'charlie', 'delta', 'echo']));
// Array [ "alpha", "delta", "echo", "charlie", "bravo" ]

只要您使用 new Chance(xxx) 设置种子,您每次都会得到相同的结果。

【讨论】:

  • 您为我节省了数小时的研究时间。正是我需要的:)
【解决方案3】:

为了以看似随机且预先确定的方式对数组进行洗牌,您可以将问题分成两部分。

1。生成伪随机数

您可以使用不同的 PRNG,但 Xorshift 非常简单,初始化和单步执行都很快,并且分布均匀。

此函数将整数作为种子值,并返回一个随机函数,该函数始终返回 0 到 1 范围内的相同浮点值。

const xor = seed => {
  const baseSeeds = [123456789, 362436069, 521288629, 88675123]

  let [x, y, z, w] = baseSeeds

  const random = () => {
    const t = x ^ (x << 11)
    ;[x, y, z] = [y, z, w]
    w = w ^ (w >> 19) ^ (t ^ (t >> 8))
    return w / 0x7fffffff
  }

  ;[x, y, z, w] = baseSeeds.map(i => i + seed)
  ;[x, y, z, w] = [0, 0, 0, 0].map(() => Math.round(random() * 1e16))

  return random
}

2。使用可配置的随机函数随机播放

Fisher Yates shuffle 是一种高效的随机分配算法。

const shuffle = (array, random = Math.random) => {
  let m = array.length
  let t
  let i

  while (m) {
    i = Math.floor(random() * m--)
    t = array[m]
    array[m] = array[i]
    array[i] = t
  }

  return array
}

把它放在一起

// passing an xor with the same seed produces same order of output array
console.log(shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9], xor(1))) // [ 3, 4, 2, 6, 7, 1, 8, 9, 5 ]
console.log(shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9], xor(1))) // [ 3, 4, 2, 6, 7, 1, 8, 9, 5 ]

// changing the seed passed to the xor function changes the output
console.log(shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9], xor(2))) // [ 4, 2, 6, 9, 7, 3, 8, 1, 5 ]

【讨论】:

    猜你喜欢
    • 2013-06-28
    • 1970-01-01
    • 2017-06-24
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多