繁体   English   中英

"以随机顺序对数组进行排序"

[英]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>对参数进行排序。

它是如何工作的<\/h3>
    如果Array.sort()<\/code>的返回值为正<\/strong>,则第一个参数的索引将高于<\/em>第二个参数的索引。<\/li>
  • 如果为负数<\/strong>,则第二个参数的索引将高于<\/em>第一个参数的索引。<\/li>
  • 而且,如果它是0<\/code> ,那么什么都不做<\/em>。<\/li><\/ul>"

Math.random()<\/strong>返回0 到 1 之间的随机值(包括 0,但不包括 1)<\/em><\/strong> 。 所以 0.5 作为中点。 如果使用大于 1 或小于 0 的使用值,那么它将始终为真或假。 因此,因此使用 0.5。

你可以在这里阅读更多关于 Math.random()<\/h2>

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。 所以你不会得到随机排序。

  1. 现在谈论从 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 > 0x < 0相同,但反过来

由于Math.random返回一个介于 0 和 1 之间的数字,并且我们还想得到负数,所以我们必须减去一些值。 这里0.5 - Math.random()会给出一个介于 0.5 和 -0.5 之间的数字

如果调用带有函数参数的sort<\/code>方法会被调用多次。 这个函数应该接受两个参数(让我们调用第一个 A 和第二个 B)每次它应该返回一个值:

  1. 小于零,如果A < B<\/code><\/li>
  2. 等于零,如果A = B<\/code><\/li>
  3. 大于零,如果A > B<\/code><\/li><\/ol>

    所以在这个例子中,我们需要随机返回值来均匀分布负值和正值。 由于Math.random()<\/code>返回的值介于 0 和 1 之间,因此0.5 - Math.random()<\/code>将返回介于 -0.5 和 0.5 之间的值,符合要求。

    "

最短形式(使用 Lambda 表达式):<\/h1>

正如其他人所提到的,要回答“如何以随机顺序对数组进行排序”的问题,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.

相关问题 打字稿数组排序与随机排序顺序 在 javascript 中按升序对随机生成的数组进行排序的问题 排序数组并保持顺序 以随机顺序打印数组? JavaScript数组按给定顺序排序 根据数组顺序对div排序 根据另一个数组的顺序对数组进行排序 按升序排序 2 个数组 javascript 按特定顺序对对象数组进行排序 按数组顺序对li项进行排序
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM