Ответы пользователя по тегу Случайные числа
  • Как сделать процентную вероятность выведения той или иной картинки из 2 массивов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    function weightedRandom(arr, key = () => 1) {
      const val = key instanceof Function ? key : n => n[key];
      const max = arr.reduce((acc, n) => acc + val(n), 0);
    
      return () => {
        let rand = Math.random() * max;
        return arr.find(n => (rand -= val(n)) < 0);
      };
    }
    
    
    const getRandomPhotosArray = weightedRandom([
      [ 9,  truePhotos ],
      [ 1, funnyPhotos ],
    ], 0);
    
    function getPhoto() {
      const photos = getRandomPhotosArray()[1];
      return photos[Math.random() * photos.length | 0];
    }
    Ответ написан
    Комментировать
  • Как сделать выборку по шансу?

    0xD34F
    @0xD34F Куратор тега JavaScript
    if (total_sum >= rand) {

    Равенство лишнее, верхняя граница не должна учитываться. Из-за этого у вас перекос в результатах.

    Ну и конечно можно всё это записать гораздо короче:

    function getRandom(arr, key) {
      const rand = Math.random() * arr.reduce((acc, n) => acc + n[key], 0);
      let sum = 0;
      return arr.find(n => (sum += n[key]) > rand);
    }
    
    
    const obj = getRandom(data, 'weight');
    Ответ написан
    Комментировать
  • Как сделать рандомный массив из 40 уникальных элементов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сначала подумал что можно рандомизированный массив засунуть в set...

    Надо наоборот - сначала set, потом массив:

    function randomArr(length, min, max) {
      const values = new Set;
      while (values.size < length) {
        values.add((Math.random() * (max - min + 1) | 0) + min);
      }
      return [...values];
    }
    
    
    const arr = randomArr(40, 1, 100);

    Но вообще, есть и другие методы.

    Например, можно создать массив со всеми возможными значениями, и выдёргивать из него элементы случайным образом, сколько надо:

    function randomArr(length, min, max) {
      const arr = Array.from({ length: max - min + 1 }, (n, i) => i + min);
      return Array.from({ length }, () => arr.splice(Math.random() * arr.length | 0, 1)[0]);
    }

    Или, создать массив со всеми возможными значениями, перемешать его, взять из начала сколько надо элементов:

    function randomArr(length, min, max) {
      const arr = Array.from({ length: max - min + 1 }, (n, i) => i + min);
    
      for (let i = arr.length; --i > 0;) {
        const j = Math.random() * (i + 1) | 0;
        [ arr[j], arr[i] ] = [ arr[i], arr[j] ];
      }
    
      return arr.slice(0, length);
    }
    Ответ написан
    1 комментарий