如何使用相同的随机排序对两个数组进行排序

Posted

技术标签:

【中文标题】如何使用相同的随机排序对两个数组进行排序【英文标题】:How to sort two arrays with the same random sort 【发布时间】:2011-07-15 11:24:58 【问题描述】:

好的,我正在用 jQuery/javascript 构建一个测验应用程序。

以下小功能旨在随机化一个问题的一系列可能答案,以及一系列照片。每张照片对应一个答案。

在调用此函数之前,照片和答案在每个包装集中的顺序相同。

函数确实随机化这两个集合。但是每一个都是单独随机的。我需要它们都具有相同的随机化。

我不知道如何实现这一点。我认为也许能够将它们链接到 jQuery 样式,但这是不对的。我还尝试在 sort() 中分离出函数,但这也没有奏效。

谁能帮忙?

function randomize() 
    var elemsPhotos = $('.photos').children('img').get();
    var elemsQuests = $('.answers').children('.answerLine').get();
    elemsPhotos.sort(function()  return (Math.round(Math.random())-0.5); );
    elemsQuests.sort(function()  return (Math.round(Math.random())-0.5); );
    $('.photos').remove('img');
    $('.answers').remove('.answerLine');
    for (var i=0; i < elemsQuests.length; i++) 
        $('.photos').append(elemsPhotos[i]);      
        $('.answers').append(elemsQuests[i]);      
    

【问题讨论】:

【参考方案1】:

如果它们以 pair 的形式出现,您可以使用 div 来保存它们并随机化 div 的顺序吗?

否则,您可以编写一个随机发生器来生成一个序列。即1,4,2,3作为索引,然后按顺序排列照片和答案?

元素 1->位置 1

元素 2->位置 4

元素 3->位置 2

元素 4->位置 3

【讨论】:

随机化索引;聪明的主意。请记住,在通过这些索引重新映射数组时必须小心。例如。如果您天真地执行上述示例,那么您会将元素 2 重新映射到位置 3,因为元素 2 在重新映射位置之前已映射到位置 4。最简单的方法是创建一个新数组并从旧数组复制。 就使用 div 而言,这对我来说并不适用,因为照片和答案都保存在彼此不同的 DIV 中。 但是您关于生成另一个索引的答案似乎是正确的。我认为这是 Yanick 在下面实施的。感谢您的帮助! 欢迎您。这也取决于您的布局,感谢luqui提醒。只是好奇,如果这两个元素相关,我总是尝试以某种方式(偏移量、div 等)将它们保持在一起。【参考方案2】:

您为什么不直接使用n 值(其中n 是问题/照片的数量)随机化一个数组并使用该数组来获取每个问题/照片数组中的“随机”索引?

var elemsPhotos = $('.photos').children('img').get();
var elemsQuests = $('.answers').children('.answerLine').get();
var n = elemsQuests.length;
var randomIndexes = [];
for (var i=0; i<n; i++) 
   randomIndexes[i] = i;

randomIndexes.sort(function()  return (Math.round(Math.random())-0.5); );

$('.photos').remove('img');
$('.answers').remove('.answerLine');
for (var i=0; i < n; i++) 
    $('.photos').append(elemsPhotos[randomIndexes[i]]);      
    $('.answers').append(elemsQuests[randomIndexes[i]]);      

【讨论】:

这成功了,除了你的 sort() 中有一个“return return”。非常感谢。【参考方案3】:

您可以随机配对(照片、任务):

var photos = $('.photos').children('img').get();
var quests = $('.answers').children('.answerLine').get();

var pairs = [];
for (var i=0; i < quests.length; i++)
  pairs[i] =  photo: photos[i], quest: quests[i] ;

// randomize 'pairs' any way you like

$.each(pairs, function(i, val) 
  $('.photos').append(val.photo);      
  $('.answers').append(val.quest);  
);

【讨论】:

以上是关于如何使用相同的随机排序对两个数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用两个 Ui Range Sliders 对相同的数据进行排序

使用随机排序顺序的打字稿数组排序

如何以相同的方式随机化两个 ArrayList?

如何对彼此相关的两个数组进行排序?

如何使用基数排序对变长字符串数组进行排序?

iOS 数组排序