Показаны сообщения с ярлыком пакет math в Golang. Показать все сообщения
Показаны сообщения с ярлыком пакет math в Golang. Показать все сообщения

вторник, 28 апреля 2020 г.

Проверка является ли число простым в Golang

Для целочисленных типов используйте ProbiablePrime(0) из пакета math/big. Этот тест на простоту на 100% точен для входных данных менее чем 2 в 64 степени (18446744073709551616).

const n = 1212121
if big.NewInt(n).ProbablyPrime(0) {
    fmt.Println(n, "- простое число")
} else {
    fmt.Println(n, "- не простое число")
}

Вывод:

1212121 - простое число

Большие числа

Для больших чисел вам необходимо указать желаемое количество тестов для ProbiablePrime(n). Для n тестов вероятность возврата истины для случайно выбранного не простого числа составляет не более (1/4)n. Распространенным выбором является использование n = 20; это дает ложную положительную оценку в 0.000,000,000,001 случаев.

z := new(big.Int)
fmt.Sscan("170141183460469231731687303715884105727", z)
if z.ProbablyPrime(20) {
    fmt.Println(z, "- возможно простое число")
} else {
    fmt.Println(z, "- не простое число")
}

Вывод:

170141183460469231731687303715884105727 - возможно простое число


Читайте также:


воскресенье, 26 апреля 2020 г.

Генерация случайных чисел, символов и элементов срезов в Golang

Используйте функции rand.Seed и rand.Int63 в пакете math/rand для генерации неотрицательного псевдослучайного числа типа int64:

rand.Seed(time.Now().UnixNano())
n := rand.Int63() // например 4601851300195147788

Аналогично, rand.Float64 генерирует псевдослучайное число с плавающей точкой x, где 0 <= x < 1:

x := rand.Float64() // например 0.49893371771268225

Предупреждение: без первоначального вызова rand.Seed вы будете получать одинаковую последовательность чисел при каждом запуске программы.

Несколько случайных источников

Все функции в пакете math/rand используют один случайный источник.

При необходимости вы можете создать новый генератор случайных чисел типа Rand со своим собственным источником, а затем использовать его методы для генерации случайных чисел:

generator := rand.New(rand.NewSource(time.Now().UnixNano()))
n := generator.Int63()
x := generator.Float64()

Целые числа и символы в заданном диапазоне

Число между a и b

Используйте rand.Intn(m), который возвращает псевдослучайное число n, где 0 <= n < m.

n := a + rand.Intn(b-a+1) // a ≤ n ≤ b

Символ между 'a' и 'z'

c := 'a' + rune(rand.Intn('z'-'a'+1)) // 'a' ≤ c ≤ 'z'

Случайный элемент из среза

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

chars := []rune("AB⌘")
c := chars[rand.Intn(len(chars))] // например '⌘'


Читайте также: