[英]Sorting an Array in Random Order
我试图了解如何以随机顺序对数组进行排序。 所以,我找到了以下代码:
var as = ["max","jack","sam"]; var s = as.sort(func); function func(a, b) { return 0.5 - Math.random(); } console.log(s);
我的主要问题是为什么他们使用0.5 而不是另一个数字? 以及它是如何工作的
你用过
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
Math.random()<\/code><\/a>返回一个介于
0<\/code>和
1<\/code> (不包括)之间的数字。
我们使用
0.5<\/code>因为它是平均值<\/strong>。
Array.sort()<\/code><\/a>根据返回值<\/strong>对参数进行排序。
因此,
0.5 - Math.random()<\/code>将以相等的概率产生正值或负值<\/em>。
因此,它将随机<\/em>对参数进行排序。
如果Array.sort()<\/code>的返回值为正<\/strong>,则第一个参数的索引将高于<\/em>第二个参数的索引。
<\/li>
而且,如果它是0<\/code> ,那么什么都不做<\/em>。
<\/li><\/ul>"
Math.random()<\/strong>返回0 到 1 之间的随机值(包括 0,但不包括 1)<\/em><\/strong> 。 所以 0.5 作为中点。 如果使用大于 1 或小于 0 的使用值,那么它将始终为真或假。 因此,因此使用 0.5。
https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Math\/random<\/a>
让我们通过示例进一步了解它
这是使用大于 1 的值时得到的结果<\/em><\/strong>
当您使用小于 0 的值时会发生这种情况<\/em><\/strong>
PS<\/em><\/strong> :-
尝试从上述所有条件打印输出,您将看到最后两个条件将始终从函数返回 true 或 false。 所以你不会得到随机排序。
现在谈论从 0 到 0.99 的任何值,您可以使用任何值,但 0.5 将最适合您的目的。因为它是一个中间点,您最有可能得到最佳答案。
如果您只想以随机方式将元素推到其起始位置附近,当然,请使用带有
random<\/code>的
sort<\/code> ,但在大多数情况下,这不是您想要的。
您想彻底打乱数组,完全随机化每个元素的位置。
并且对于内置
sort<\/code>函数中的
random<\/code>是一种糟糕的做法,因为它偏向于初始状态,这意味着“洗牌”数组中的元素将倾向于停留在它们的位置附近(那些靠近开始的元素有停留在起点附近的可能性很高,等等......)。
数组越大,被洗牌的次数就越少。
这是证明: 使用 JavaScript Array.sort() 方法进行改组是否正确?<\/a>
这是我大部分时间使用的洗牌数组的功能。 它彻底随机化了每个元素的位置。
function shuffle(arr) { // randomly rearanges the items in an array
const result = [];
for (let i = arr.length-1; i >= 0; i--) {
// picks an integer between 0 and i:
const r = Math.floor(Math.random()*(i+1)); // NOTE: use a better RNG if cryptographic security is needed
// inserts the arr[i] element in the r-th free space in the shuffled array:
for(let j = 0, k = 0; j <= arr.length-1; j++) {
if(result[j] === undefined) {
if(k === r) {
result[j] = arr[i]; // NOTE: if array contains objects, this doesn't clone them! Use a better clone function instead, if that is needed.
break;
}
k++;
}
}
}
return result;
}
Math.random
返回一个介于 0 和 1 之间的数字。
排序函数使用返回值x
如下:
x == 0
:相同的值,可以“随心所欲”订购
x < 0
:第一个对象小于第二个,因此它在排序数组中的索引将小于另一个
x > 0
与x < 0
相同,但反过来
由于Math.random
返回一个介于 0 和 1 之间的数字,并且我们还想得到负数,所以我们必须减去一些值。 这里0.5 - Math.random()
会给出一个介于 0.5 和 -0.5 之间的数字
如果调用带有函数参数的
sort<\/code>方法会被调用多次。
这个函数应该接受两个参数(让我们调用第一个 A 和第二个 B)每次它应该返回一个值:
小于零,如果A < B<\/code>
<\/li>
等于零,如果A = B<\/code>
<\/li>
大于零,如果A > B<\/code>
<\/li><\/ol> 所以在这个例子中,我们需要随机返回值来均匀分布负值和正值。 由于Math.random()<\/code>返回的值介于 0 和 1 之间,因此0.5 - Math.random()<\/code>将返回介于 -0.5 和 0.5 之间的值,符合要求。
"
正如其他人所提到的,要回答“如何以随机顺序对数组进行排序”的问题,Array.sort() 函数可以将函数作为参数。
语法<\/strong>:
内部
sort_by_function()<\/code>接受两个参数(例如:x 和 y)并使用
Math.random()<\/code>返回 -0.5 到 0.5 之间的值,它返回:
负数(-0.5 到 -0.1),如果 x < y<\/li>
- 零 (0),如果 x = y 正<\/li>
- 正数(0.1 到 0.5),如果 x > y<\/li><\/ul>
请记住,如果您不向外部
Array.sort()<\/code>函数传递任何内容,它只会按升序<\/em>重新排列\/排序元素,但是,如果您传入一个函数(作为参数),那么它的行为基于什么内部
sort_by_function()<\/code>返回,因为它交换给定数组的每个元素(通过一次交换两个元素对)本质上,这种交换是根据内部
sort_by_function()<\/code>返回的内容决定的。
为了实现随机排序,
Array.sort()<\/code>函数将重新排列\/排序每对元素,如下所示:
- 负值:升序交换,<\/li>
- 零:没有变化,<\/li>
正值:降序交换。<\/li><\/ul>
示例<\/strong>:
由于没有人提到使用短 Lambda 表达式,这里有一个示例,说明如何使用 Lambda 表达式来缩短内部参数函数,如下所示:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.