我有一个输出多个ID的数组。该订单应该被洗牌,但第一个ID应该保持在这个位置。 我看过Fisher-Yates(又名Knuth)Shuffle,但我不知道如何为我的情况编辑它。
一种方法是将其拆分为两个数组。一个与单个对象。然后用另一个帖子将数组洗牌。在洗牌之后,我像在这个小提琴中那样组合了两个数组:https://jsfiddle.net/464fmfty/2/
// array listing post ids
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82];
var arrNew = [];
arrNew.push(arr.shift());
arr = shuffle(arr);
arrNew.push(arr);
document.body.innerHTML= arrNew;
但我想知道是否有更好/更美丽的方法来做到这一点?
答案 0 :(得分:1)
shuffle
函数应该像shuffle(arr, start, length)
一样调用,然后代码变得简单。
function shuffle(array, start, length) { var currentIndex, i, tmp, randomIndex; for (i = length; i > 1; i--) { // Pick a remaining element... randomIndex = start + Math.floor(Math.random() * i); currentIndex = start + i - 1; // And swap it with the current element. tmp = array[currentIndex]; array[currentIndex] = array[randomIndex]; array[randomIndex] = tmp; } } // array listing post ids var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82]; shuffle(arr, 1, arr.length - 1); document.body.innerHTML= arr;
请注意,我删除了return arr
,因为当一个函数就地修改数组并且返回它时会让人感到困惑。
答案 1 :(得分:1)
我猜你可能会这样做
Do
l_oElementCollection = m_oWebrowser1.Document.GetElementById("listOfStuff").Children
Windows.Forms.Application.DoEvents()
Loop Until l_oElementCollection.Count > 250
答案 2 :(得分:-1)
好吧,不要选择2个随机位置进行随机播放,而是选择大于0的2。
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82]
for (var i = 0; i < 50; i++) {
var from = Math.floor(Math.random() * (arr.length - 1)) + 1;
var to = Math.floor(Math.random() * (arr.length - 1)) + 1;
var temp = arr[from];
arr[from] = arr[to];
arr[to] = temp;
}