Не запускайте строку кода 5% от общего времени - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь реализовать свой код обработки так, чтобы строка кода НЕ выполнялась 5% от общего числа раз, которое строка кода должна выполняться. Но важнейшим дополнительным моментом является то, что случай, когда строка не будет работать, должен быть непредсказуемым (случайным).

Например, предположим, что код должен выполняться 20 раз. Я хочу, чтобы код не работал в одном из 20 экземпляров. Этот один экземпляр будет 5% от общего числа (20) [1/20 = 5%].

Это должно быть случайным, чтобы, например, в первой итерации 20 код не выполнялся в 3-м испытании и во второй итерации строка не запускается в 10-м испытании.

Это иллюстрация:

Первая итерация: [1, 2, 3 (Не запускать), 4, 5, 6, 7, 8, 9, 10, 11, 12 , 13, 14, 15, 16, 17, 18, 19, 20] Вторая итерация: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 (Не бегать), 11, 12 , 13, 14, 15, 16, 17, 18, 19, 20] Третья итерация:.

Я написал псевдокод ниже, но удивляюсь, есть ли лучший способ сделать это.

create an array [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 

take a number out of a set randomly and if the number is NOT 1:
    println("run")    
    get rid of the selected number within an array
if the set is empty, get a new set

1 Ответ

0 голосов
/ 16 января 2020

Критический вопрос, который вам нужно задать, заключается в том, разрешено ли выполнение кода более одного раза. У вас есть 5% -ое изменение приземления на 1 на первой итерации, но у вас также есть шанс 5% на посадку на 1 на последующих итерациях, если число не будет удалено. Это приемлемо? Если нет, просто удалите значение «catch» после того, как оно получено.

Существует также несколько более короткий способ проиллюстрировать такой выбор, и это будет через по модулю :

generate a random number:
    divide the number by 20
    check that the modulo is equal to 0

Что бы выглядело примерно так:

rand() % 20 == 0

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

generate a random number
if not failed yet:
    if random number divided by 20 has a modulo of 0:
        denote a failure

или как код:

if (not failed_run) {
    if (rand() % 20 == 0) {
        failed_run = true
    }
}

Также обратите внимание, что существует небольшое смещение распределения веса , когда проверка случайного числа по модулю. Это будет более проблематично c, чем меньше размер выборки (в нашем случае 20), поэтому, возможно, стоит принять во внимание.

...