cool
cool

Reputation: 65

same values get repeated while randomly relecting from an array

I have an array items which have 29 values. Im selecting 9 values randomly from array items .

my problems is while selecting 9 elements randomly, values get repeated more than once in selected 9 elements.

How to avoid this repetion of same elements

var items = [  
      { label: '1', url: '1.png'  },
      { label: '2', url: '2.png'  },
      { label: '3', url: '3.png'  },
      { label: '4', url: '4.png'  },
      { label: '5', url: '5.png'  },
      { label: '6', url: '6.png'  },
      { label: '7', url: '7.png'  },
      { label: '8', url: '8.png'  },
      { label: '9', url: '9.png'  },
	  { label: '10', url:'10.png' },
      ];
	  
	  
for (var index = 0; index <4; index++) 
     {
      randomIndex = Math.floor(Math.random() * items.length);
  console.log(randomIndex);
   
    }

Upvotes: 3

Views: 41

Answers (2)

Robby Cornelissen
Robby Cornelissen

Reputation: 97130

You can use a Set. Because it doesn't allow duplicate elements, you can just keep on adding until its size reaches 9.

const items = [{label:'1',url:'1.png'},{label:'2',url:'2.png'},{label:'3',url:'3.png'},{label:'4',url:'4.png'},{label:'5',url:'5.png'},{label:'6',url:'6.png'},{label:'7',url:'7.png'},{label:'8',url:'8.png'},{label:'9',url:'9.png'},{label:'10',url:'10.png'},{label:'11',url:'11.png'},{label:'12',url:'12.png'},{label:'13',url:'13.png'},{label:'14',url:'14.png'},{label:'15',url:'15.png'},{label:'16',url:'16.png'},{label:'17',url:'17.png'},{label:'18',url:'18.png'},{label:'19',url:'19.png'},{label:'20',url:'20.png'},{label:'21',url:'21.png'},{label:'22',url:'22.png'},{label:'23',url:'23.png'},{label:'24',url:'24.png'},{label:'25',url:'25.png'},{label:'26',url:'26.png'},{label:'27',url:'27.png'},{label:'28',url:'28.png'},{label:'29',url:'29.png'}];

const selected = new Set();

while (selected.size <= 9) {
  selected.add(items[Math.floor(Math.random() * items.length)]);
}

console.log([...selected]);

This works well as long as your array to select from is substantially larger than the number of items you want to select. If not, performance might suffer because of duplicate elements being selected over and over again.

Upvotes: 2

CertainPerformance
CertainPerformance

Reputation: 370679

You need to select items without replacement. One method would be to remove the random item from the array when you choose it:

var items=[{label:'1',url:'1.png'},{label:'2',url:'2.png'},{label:'3',url:'3.png'},{label:'4',url:'4.png'},{label:'5',url:'5.png'},{label:'6',url:'6.png'},{label:'7',url:'7.png'},{label:'8',url:'8.png'},{label:'9',url:'9.png'},{label:'10',url:'10.png'},]

for (var index = 0; index < 9; index++) {
  const randomIndex = Math.floor(Math.random() * items.length);
  const [randomItem] = items.splice(randomIndex, 1);
  console.log(randomItem);
}

If you need the original array to stay as is, without mutation, then you can create a copy first, and remove items from that copy:

const itemsTemp = items.slice();

Upvotes: 3

Related Questions