Задать вопрос
Ответы пользователя по тегу Случайные числа
  • Как сделать процентную вероятность выведения той или иной картинки из 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 createRandomArr(size, min, max) {
      if (size > (max -= ~-min)) {
        throw 'невозможно создать массив указанного размера';
      }
    
      const values = new Set;
      for (; values.size < size; values.add(min + Math.random() * max | 0)) ;
      return [...values];
    }
    
    const arr = createRandomArr(40, 1, 100);

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

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

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

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

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