在 cljs 中,{{clojure.core.async/random-array}} 的打乱顺序错误,导致它对于参数 n=2 总是返回 \[1 0\]。这违反了 alts! 对操作选择的非确定性承诺,因为它总是首先尝试第二个元素。此外,当 N>1 时,alts! 的大小为 N 的第一个操作永远不会首先选择。
使用 goog.array.shuffle 来进行打乱顺序。 (这个 API 也被 cljs.core/shuffle 使用)
新实现通过测试,表现更佳
{代码:java}
cljs.user=> (frequencies (take 10000 (map vec (repeatedly #(a/random-array 2)))))
警告: var: cljs.core.async/random-array 在行 1 中不是公开的 <cljs repl>
{[0 1] 4964, [1 0] 5036}
cljs.user=> (frequencies (take 10000 (map vec (repeatedly #(clojure.core.async/random-array 3)))))
警告: var: cljs.core.async/random-array 在行 1 中不是公开的 <cljs repl>
{[0 1 2] 1720, [1 2 0] 1679, [2 0 1] 1669, [0 2 1] 1573, [1 0 2] 1682, [2 1 0] 1677}
cljs.user=> (pp)
{[0 1 2] 1720,
[1 2 0] 1679,
[2 0 1] 1669,
[0 2 1] 1573,
[1 0 2] 1682,
[2 1 0] 1677}
nil