Комбинация Math.round (Math.random ()), кажется, генерирует слишком много нулей в моей программе JavaScript - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь создать действительно простой скрипт для генерации 2d-массива, в котором каждый 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 всегда является максимальным из всех возможных значений для данного numEls. Я предполагаю, что это как-то связано с работой Math.random () и Math.round (), но я не уверен. Может ли кто-нибудь дать мне некоторое представление? Спасибо.

1 Ответ

0 голосов
/ 10 января 2019

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

Пример с одной цифрой и коэффициентом 2 в качестве индекса для массива длиной 2.

Как вы видите, индекс второй половины перемещается к следующему индексу каждого числа, что приводит к неправильному индексу и с наибольшим случайным значением, вы получаете индекс за пределами требуемой длины.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...