Голанг 1 в миллионной вероятности - PullRequest
0 голосов
/ 25 марта 2019

Я изучаю немного Go и делаю некоторые упражнения для интервью. У меня есть одно упражнение, в котором просят выполнить какую-то операцию случайным образом с вероятностью 1 на миллион.

Допустим, я хочу return true один раз на миллион.

Если бы моя математика все еще была правильной (и Google тоже), я бы вычислил это с выражением math.Pow(1-(1/1000000),1000000), однако это постоянно возвращает мне 1, что кажется неправильным.

Учитывая это описание, как я могу гарантировать, что я верну true только один раз из миллиона? Это звучит тривиально, но я действительно борюсь с этим.

Ответы [ 2 ]

4 голосов
/ 25 марта 2019
Стандартная библиотека

Go имеет пакет rand и функцию Intn(), которая даст вам псевдослучайное число в диапазоне [0, n). Таким образом, чтобы запустить событие с вероятностью 1/1000000, вы можете сделать что-то вроде

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    n := rand.Intn(1000000)
    if n == 154397 {
        fmt.Println("I am a lucky bastard!")
    } else {
        fmt.Println("I am not")
    }
}

Нет необходимости говорить, что 154397 можно заменить любым другим целым числом в диапазоне. Ссылка на игровую площадку

3 голосов
/ 25 марта 2019

выражение math.Pow(1-(1/1000000),1000000) однако это сохраняет возвращаю мне 1 постоянно, что кажется неправильным.


1/1000000 - ноль. Целочисленное деление усекается до нуля.

Использовать плавающую точку, 1,0, а не 1:

package main

import (
    "fmt"
    "math"
)

func main() {
    p := math.Pow(1-(1/1000000), 1000000)
    fmt.Println(p)
    p = math.Pow(1-(1.0/1000000), 1000000)
    fmt.Println(p)
}

Детская площадка: https://play.golang.org/p/ZhUAe6imaNv

Выход:

1
0.36787925722078507
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...