Читатели като вас помагат в подкрепа на MUO. Когато правите покупка чрез връзки на нашия сайт, ние може да спечелим комисионна за партньор. Прочетете още.

Генерирането на случайни числа е важно за много задачи. Те включват разработка на игри, криптография и анализ на данни. Случайните стойности позволяват различни резултати с елемент на променливост и непредсказуемост.

Go предоставя два пакета за генериране на произволни стойности в стандартната библиотека: математика/ранд и крипто/ранд. The математика/ранд Пакетът е основно за математически операции. The крипто/ранд пакетът обработва криптографски сигурни операции.

Ранд пакетите

The математика/ранд пакетът предоставя гъвкав метод за генериране на случайни числа. Той прилага различни генерирания на псевдослучайни числа. Пакетът може да генерира произволно число с различни разпределения и да използва семена за контрол на произволната последователност. Може също така да генерира случайни числа едновременно или паралелно.

The крипто/ранд пакетът имплементира криптографски защитен генератор на случайни числа. Той включва функционалност за генериране на произволни прости числа с висока вероятност.

instagram viewer

Тъй като тези пакети имат едно и също име, ще трябва да използвате псевдоними, ако искате да използвате и двата в една програма, например:

импортиране (
кранд "крипто/ранд"
mrand "математика/ранд"
)

Генериране на случайни цели числа в Go

Можете да използвате математика/рандВътр функция за генериране на произволни числа в диапазон.

импортиране (
"fmt"
"математика/ранд"
"време"
)

функосновен() {
ранд. Семе (време. Сега().UnixNano())

// Intn генерира произволно цяло число между 0 и 100
// (без 100)
randomInt := rand. Intn(100)

fmt. Println (randomInt)
}

Този код предава текущото време на семена функция. Той инициализира генератора на случайни числа по подразбиране за псевдо-случайност.

The Вътр функцията на пакета rand генерира произволно число между определен диапазон, в този случай от 0 до 100.

Генериране на случайни числа с плаваща запетая

Можете да генерирате произволни числа с плаваща запетая с Float32 и Float64 функции. Те връщат съответно 32-битови и 64-битови числа с плаваща запетая.

Ето как можете да генерирате произволни 64-битови числа с плаваща запетая в Go.

импортиране (
"fmt"
"математика/ранд"
"време"
)

функосновен() {
ранд. Семе (време. Сега().UnixNano())

// генериране на случаен float64 между 0.0 и 1.0
randomFloat := rand. Float64()

fmt. Println (randomFloat)
}

Процесът на генериране на 32-битови числа с плаваща запетая е същият като генерирането на произволни 64-битови числа с плаваща запетая.

Генериране на криптографски сигурни произволни числа в Go

Можете да използвате Вътр функция на крипто/ранд пакет за генериране на криптографски защитено произволно число. The Вътр функцията приема инстанция на четец и максимален брой за ограничението.

импортиране (
"крипто/ранд"
"fmt"
"математика/голям"
)

функосновен() {
// Създайте голям. Int с максималната стойност за желания диапазон
макс. := голям. NewInt(100000000)

// Генериране на случаен голям. Вътр
// Първият аргумент е четец, който връща произволни числа
// Вторият аргумент е максималната стойност (не включва)
randInt, грешка := rand. Int (ранд. Читател, макс.)

ако грешка!= нула {
fmt. Println(„Грешка при генериране на случайно число:“, грешка)
връщане
}

fmt. Println(„Случайно число:“, randInt)
}

The макс променлива дефинира максималната стойност за произволното число, използвайки NewInt функция на математика/голям пакет. The Вътр функцията връща произволно цяло число и грешка за обработка.

Генериране на криптографски сигурни произволни стойности

The крипто/ранд пакетът не предоставя вградена функционалност за генериране криптографски защитени произволни низове. Все пак можете да заобиколите това, като използвате Прочети функция.

импортиране (
"крипто/ранд"
"fmt"
)

функcryptoRandom(stringChars низ, valueLength int32)низ {
bytesSlice := направи([]байт, valueLength)
_, грешка := ранд. Четене (bytesSlice)

ако грешка!= нула {
връщане„Възникна грешка при четене от среза на байта“
}

за позиция, стойност := диапазон bytesSlice {
произволно := стойност % байт(len(stringChars))
bytesSlice[pos] = stringChars[randomize]
}

връщанениз(bytesSlice)
}

функосновен() {
fmt. Println (cryptoRandom("Пневмоноултрам" +
"микроскопична силикововулканокониоза", 10))
}

The cryptoRandom функцията по-горе приема низ, от който да генерира произволен низ. Той също така взема дължина - 32-битово цяло число - и връща низ.

В cryptoRandom функция, на bytesSlice променливата е част от необходимата дължина на низа. Цикълът for-range преминава през байтовия срез и връща и извлича модула на елементите на среза и дължината на низа в байтове. Той актуализира индекса на байтовия срез с индекса на модулната стойност на низа.

И накрая, на cryptoRandom функцията връща формата на низа на байтовия срез.

Можете да генерирате UUID с Go

Генерирането на случайни стойности е полезно за широк спектър от случаи на употреба. Ако имате нужда от много произволни, уникални стойности, можете да използвате UUID.

UUID (универсално уникални идентификатори) осигуряват глобална уникалност на идентификаторите. Можете да ги използвате, за да правите разлика между ресурсите в различните системи, като същевременно избягвате конфликти при именуване.

Има много пакети, които можете да използвате за генериране на UUID в Go. Можете да използвате пакета os, за да извикате uuid команда на вашата операционна система, използвайте пакета UUID на Google или използвайте пакета gouuid за генериране UUID.