gpt4 book ai didi

javascript - 多次随机生成成对的唯一数字

转载 作者:行者123 更新时间:2023-11-30 10:29:40 25 4
gpt4 key购买 nike

我试图在 x 次过程中设置一对唯一数字

例如,如果 x = 8 我想生成如下内容:

(5,3) (1,4) (7,2) (8,6)

目前我有:

var playerArray = [0,1,2,3,4,5,6,7];
var loopLength = playerArray.length;
var player1 = 0;
var player2 = 0;
for(var i = 1; i <= loopLength;i++){
var num = Math.floor(Math.random() * playerArray.length);
if(player1 == 0){
player1 = num+1;
playerArray.splice(num, 1);
}else if(player2 == 0){
player2 = num+1;
playerArray.splice(num, 1);
}

if((player1 != 0) && player2 != 0){
alert(player1 + ' vs ' + player2);
player1 = 0;
player2 = 0;
}

}

我认为,问题是我使用索引来分配数字,当我拼接它们时它会重置索引,所以我最终可以得到 1 对 2、1 对 3、2 对 3 等等。

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

我喜欢@JeroenVannevel 使用洗牌的想法,或者这里是我脑海中浮现的一种方法:

// Given an array of player IDs, return an array of random pairs
function randomPairs( players ) {
var pairs = [];
while( players.length ) {
pairs.push([
pluckRandomElement( players ),
pluckRandomElement( players )
]);
}
return pairs;
}

// Return a random element and remove it from the array
function pluckRandomElement( array ) {
var i = randomInt( array.length );
return array.splice( i, 1 )[0];
}

// Return a random integer 0 <= n < limit
function randomInt( limit ) {
return Math.floor( Math.random() * limit );
}

@LeeMeador 分享了关于这段代码的有趣见解:

        output.push([
pluckRandomElement( array ),
pluckRandomElement( array )
]);

这里没有必要为两个值使用随机元素。由于数组已经随机化,您可以提取第一个数组元素和一个随机元素。或者使用 array.pop() 提取最后一个元素——对于一个非常长的数组,效率可能稍微高一些:

        output.push([
array.pop(),
pluckRandomElement( array )
]);

这是另一个版本,按照 Jeroen 的建议使用随机播放:

// Given an array of player IDs, return an array of random pairs
function randomPairs( players ) {
shuffle( players );
var output = [];
for( var i = 0, n = players.length; i < n; i += 2 ) {
output.push([ players[i], players[i+1] ]);
}
return output;
}

// Shuffle an array in place using the Fisher-Yates algorithm,
// adapted from http://bost.ocks.org/mike/shuffle/
function shuffle( array ) {
for( var m = array.length; m; ) {
var i = Math.floor( Math.random() * m-- );
var t = array[m];
array[m] = array[i];
array[i] = t;
}
return array;
}

可以使用此代码测试任一版本:

// Create an array of length n and values 1 through n
function createPlayerArray( nPlayers ) {
var array = [];
for( var i = 0; i < nPlayers; ++i ) {
array.push( i + 1 );
}
return array;
}

var players = createPlayerArray( 8 );
console.log( randomPairs(players) );

我将玩家数组的创建与其余代码分开,以允许非连续玩家 ID 的可能性(例如来自数据库等的 ID 字段)。

关于javascript - 多次随机生成成对的唯一数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17619741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com