相关疑难解决方法(0)

如何随机化(shuffle)一个JavaScript数组?

我有这样一个数组:

var arr1 = ["a", "b", "c", "d"];
Run Code Online (Sandbox Code Playgroud)

我如何随机化/随机播放?

javascript arrays shuffle

1138
推荐指数
36
解决办法
67万
查看次数

使用JavaScript Array.sort()方法进行混洗是否正确?

我用他的JavaScript代码帮助了一个人,我的眼睛被一个看起来像这样的部分抓住了:

function randOrd(){
  return (Math.round(Math.random())-0.5);
}
coords.sort(randOrd);
alert(coords);
Run Code Online (Sandbox Code Playgroud)

我的第一个是:嘿,这不可能奏效!但后来我做了一些实验,发现它确实至少似乎提供了很好的随机结果.

然后我做了一些网络搜索,几乎在顶部发现了一篇文章,这段代码最简单地被复制.看起来像一个相当可敬的网站和作者......

但我的直觉告诉我,这一定是错的.特别是因为ECMA标准没有规定排序算法.我认为不同的排序算法会导致不同的非均匀混洗.一些排序算法甚至可能无限循环...

但你怎么看?

而另一个问题是......现在我将如何衡量这种改组技术的结果是多么随机?

更新:我做了一些测量并将结果发布在下面作为答案之一.

javascript sorting random shuffle

124
推荐指数
6
解决办法
5万
查看次数

为什么这种随机播放算法没有偏差

我的同事和我正在争论为什么在这个JS提示和技巧列表中给出的随机算法不会产生偏见的结果,就像杰夫阿特伍德描述的天真洗牌一样.

提示中的数组shuffle代码是:

list.sort(function() Math.random() - 0.5);
Run Code Online (Sandbox Code Playgroud)

Jeff的天真洗牌代码是:


for (int i = 0; i < cards.Length; i++)
{
  int n = rand.Next(cards.Length);
  Swap(ref cards[i], ref cards[n]);
}
Run Code Online (Sandbox Code Playgroud)

我写了这个JS来测试shuffle:


var list = [1,2,3];
var result = {123:0,132:0,321:0,213:0,231:0,312:0};
function shuffle() { return Math.random() - 0.5; }
for (var i=0; i<60000000; i++) {
    result[ list.sort(shuffle).join('') ]++;
}
Run Code Online (Sandbox Code Playgroud)

为此我获得了结果(来自Firefox 5),如:

Order   Count          %Diff True Avg
123      9997461       -0.0002539
132     10003451        0.0003451
213     10001507        0.0001507
231      9997563       -0.0002437
312      9995658       -0.0004342
321 …

javascript sorting shuffle

6
推荐指数
1
解决办法
475
查看次数

标签 统计

javascript ×3

shuffle ×3

sorting ×2

arrays ×1

random ×1