如何防止在for循环中从数组中选择两次数字?在这种情况下,我想确保 pictureNo 每次都是唯一的。
$(document).ready(function () {
// Generate timeline items
var timelineItemCount = Math.floor(Math.random() * 9) + 1;
for(i=0;i<timelineItemCount;i++)
{
generateTimeline();
}
});
function generateTimeline() {
// Select gender
var genderArray = ['male','female'];
var gender = genderArray[Math.floor(Math.random()*genderArray.length)];
// Select profile picture - how do I prevent the same number from being selected once here
var pictureNo = Math.floor(Math.random() * 19) + 1;
// Create timeline entry
$('#home-page').append($('<div class="timeline-item"><img src="assets/img/' + gender + '_profile' + pictureNo + '.jpg" alt="" class="img-rounded profile"></div>'));
}
答案 0 :(得分:1)
尝试并存储随机选择的数字,以便每次随机选择新数字时,您都有条件,以便将其与之前选择的数字进行比较。如果先前已选择该号码,则应选择一个新的随机数。
答案 1 :(得分:1)
在for循环外创建一个数组并存储生成的随机数。 在for循环的每次迭代中,检查新的随机数是否属于该数组。 当for循环结束时,将数组重置为空数组。
答案 2 :(得分:1)
让我们定义两个男性和女性指数数组,性别数组,洗牌和弹出一些项目。使用Underscore.JS很容易,例如:
var malesCount = 20;
var femalesCount = 20;
var profiles = {
'male' : _.shuffle(_.range(1, malesCount + 1)),
'female' : _.shuffle(_.range(1, femalesCount + 1)),
};
var genders = [];
for (var index = 0; index < malesCount; index++) {
genders.push('male');
}
for (var index = 0; index < femalesCount; index++) {
genders.push('female');
}
genders = _.shuffle(genders);
var gender;
var pictureNo;
var src;
while (gender = genders.pop()) {
pictureNo = profiles[gender].pop();
src = 'assets/img/' + gender + '_profile' + pictureNo + '.jpg';
console.log(src);
}
我已经为50K的男性和50K的女性测试了这个解决方案,它只在115毫秒内执行。
答案 3 :(得分:0)
试试这个: -
$(document).ready(function () {
// Generate timeline items
var timelineItemCount = Math.floor(Math.random() * 9) + 1.
selectedPicObj={};
for(i=0;i<timelineItemCount;i++)
{
generateTimeline(selectedPicObj);
}
});
function generateTimeline(selectedPicObj) {
// Select gender
var genderArray = ['male','female'], i=0;
var gender = genderArray[Math.floor(Math.random()*genderArray.length)];
// Select profile picture - how do I prevent the same number from being selected once here
var pictureNo = Math.floor(Math.random() * 19) + 1;
for(;i<19;i++){
if(!selectedPicObj[pictureNo]){
selectedPicObj[pictureNo] = true;
break;
}else{
pictureNo++;
if(pictureNo === 19){
pictureNo = 0;
}
}
}
// Create timeline entry
$('#home-page').append($('<div class="timeline-item"><img src="assets/img/' + gender + '_profile' + pictureNo + '.jpg" alt="" class="img-rounded profile"></div>'));
}