Комбинация Math.round (Math.random ()), похоже, генерирует слишком много 0 в моей программе javascript

Я пытаюсь создать действительно простой скрипт для создания 2-мерного массива, в котором каждый n-й массив не содержит собственного индекса в качестве элемента, но содержит случайное количество других рандомизированных значений индекса в качестве своих элементов и не может быть пустым. Вот небольшой код, который я написал, чтобы попытаться добиться этого:

totElList = []
numEls = 1000

for (i=0;i<numEls;i++) {
    totElList[i] = []
    for (j=0;j<numEls;j++) {
        totElList[i][j] = j
    }
}

for (i in totElList) {
    totsplice = Math.round(Math.random()*(numEls-1))
    totElList[i].splice(i,1)
    for (j=0;j<totsplice;j++) {
        rand = Math.round(Math.random()*totElList[i].length)
        while (typeof(totElList[i][rand]) === undefined) {rand = Math.round(Math.random()*totElList[i].length)}
        totElList[i].splice(rand,1)
    }
}

Проблема в том, что когда я запускаю это, кажется, что массив totElList содержит больше 0, чем любое другое число, хотя я предполагал, что элементы будут удалены случайным образом. Я сделал тест, чтобы подтвердить это. Количество нулей всегда является максимальным из всех возможных значений для данного числа. Я предполагаю, что это как-то связано с работой Math.random () и Math.round (), но я не уверен. Не мог бы кто-нибудь дать мне некоторое представление? Спасибо.

прошу добавить рабочий пример. на самом деле это работает вечно.

Nina Scholz 10.01.2019 11:25

вместо Math.round возьмите Math.floor, который лучше работает для индексов, потому что он отсчитывается от нуля.

Nina Scholz 10.01.2019 11:27

Вы можете уменьшить количество, если он работает медленно для вас. Я понимаю, что вы имеете в виду с Math.floor, хотя это работает как шарм, спасибо. Я думаю, это была просто проблема с числами, которая сбивала меня с толку ... не в первый раз.

user208480 10.01.2019 11:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
36
1

Ответы 1

Вместо Math.round возьмите Math.floor, который лучше работает для индексов, потому что он основан на нуле.

Example with one digit and a factor of 2 as index for an array with length of 2.

As you see, the second half index is moved to the next index of every number, which results into a wrong index and with the greatest random value, you get an index outside of the wanted length.

value  round  floor  comment for round
-----  -----  -----  -----------------
 0.0     0      0
 0.1     0      0
 0.2     0      0
 0.3     0      0
 0.4     0      0
 0.5     1      0    wrong index
 0.6     1      0    wrong index
 0.7     1      0    wrong index
 0.8     1      0    wrong index
 0.9     1      0    wrong index
 1.0     1      1
 1.1     1      1
 1.2     1      1
 1.3     1      1
 1.4     1      1
 1.5     2      1    wrong index
 1.6     2      1    wrong index
 1.7     2      1    wrong index
 1.8     2      1    wrong index
 1.9     2      1    wrong index

Другие вопросы по теме