بیاموزید که چگونه یک خط تیره غیرقابل پیش بینی به بازی ها یا شبیه سازی های خود اضافه کنید.
تولید اعداد تصادفی برای بسیاری از وظایف مهم است. اینها شامل توسعه بازی، رمزنگاری و تجزیه و تحلیل داده ها است. مقادیر تصادفی به نتایج متمایز با عنصر متغیر و غیرقابل پیش بینی اجازه می دهد.
Go دو بسته را برای تولید مقادیر تصادفی در کتابخانه استاندارد ارائه می دهد: math/rand و crypto/rand. بسته ریاضی/رند عمدتاً برای عملیات ریاضی است. بسته crypto/rand عملیات رمزنگاری امن را مدیریت می کند.
بسته های رند
بسته ریاضی/رند روشی انعطاف پذیر برای تولید اعداد تصادفی ارائه می دهد. انواع مختلفی از نسل های اعداد شبه تصادفی را پیاده سازی می کند. بسته می تواند یک عدد تصادفی با توزیع های مختلف تولید کند و از دانه ها برای کنترل دنباله تصادفی استفاده کند. همچنین می تواند اعداد تصادفی را همزمان یا موازی تولید کند.
بسته crypto/rand یک مولد اعداد تصادفی امن رمزنگاری را پیاده سازی می کند. این شامل قابلیت تولید اعداد اول تصادفی با احتمال زیاد است.
از آنجایی که این بسته ها نام یکسانی دارند، اگر می خواهید از هر دو در یک برنامه استفاده کنید، باید از نام مستعار استفاده کنید، به عنوان مثال:
import (
crand "crypto/rand"
mrand "math/rand"
)
تولید اعداد صحیح تصادفی در Go
می توانید از تابع math/rand’sIntn برای تولید اعداد تصادفی در یک محدوده استفاده کنید.
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
// Intn generates a random integer between 0 and 100
// (not including 100)
randomInt := rand.Intn(100)
fmt.Println(randomInt)
}
این کد زمان فعلی را به تابع Seed ارسال می کند. مولد اعداد تصادفی پیشفرض را برای شبه تصادفی اولیه میکند.
تابع Intn بسته rand یک عدد تصادفی بین یک محدوده مشخص تولید می کند، در این مورد 0 تا 100.
ایجاد اعداد ممیز شناور تصادفی
می توانید اعداد ممیز شناور تصادفی را با توابع Float32 و Float64 ایجاد کنید. آنها به ترتیب اعداد ممیز شناور 32 بیتی و 64 بیتی را برمی گردانند.
در اینجا نحوه تولید اعداد ممیز شناور تصادفی 64 بیتی در Go آمده است.
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
// generate a random float64 between 0.0 and 1.0
randomFloat := rand.Float64()
fmt.Println(randomFloat)
}
فرآیند تولید اعداد ممیز شناور 32 بیتی همانند تولید اعداد ممیز شناور تصادفی 64 بیتی است.
ایجاد اعداد تصادفی امن رمزنگاری در Go
می توانید از تابع Int بسته crypto/rand برای تولید یک شماره تصادفی امن رمزنگاری استفاده کنید. تابع Int یک نمونه خواننده و یک عدد حداکثر برای حد را می گیرد.
import (
"crypto/rand"
"fmt"
"math/big"
)
func main() {
// Create a big.Int with the maximum value for the desired range
max := big.NewInt(100000000)
// Generate a random big.Int
// The first argument is a reader that returns random numbers
// The second argument is the maximum value (not inclusive)
randInt, err := rand.Int(rand.Reader, max)
if err != nil {
fmt.Println("Error generating random number:", err)
return
}
fmt.Println("Random number:", randInt)
}
متغیر max با استفاده از تابع NewInt بسته ریاضی/بزرگ، حداکثر مقدار را برای عدد تصادفی تعریف می کند. تابع Int عدد صحیح تصادفی و یک خطا را برای مدیریت برمی گرداند.
ایجاد مقادیر تصادفی امن رمزنگاری
بسته crypto/rand عملکرد داخلی برای تولید رشتههای تصادفی امن از نظر رمزنگاری ارائه نمیکند. با این حال، میتوانید با استفاده از تابع Read راه خود را حل کنید.
import (
"crypto/rand"
"fmt"
)
func cryptoRandom(stringChars string, valueLength int32) string {
bytesSlice := make([]byte, valueLength)
_, err := rand.Read(bytesSlice)
if err != nil {
return "There was an error reading from the byte slice"
}
for pos, value := range bytesSlice {
randomize := value % byte(len(stringChars))
bytesSlice[pos] = stringChars[randomize]
}
return string(bytesSlice)
}
func main() {
fmt.Println(cryptoRandom("Pneumonoultram" +
"icroscopicsilicovolcanoconiosis", 10))
}
تابع cryptoRandom بالا یک رشته را برای تولید یک رشته تصادفی از آن می گیرد. همچنین یک طول می گیرد – یک عدد صحیح 32 بیتی – و یک رشته را برمی گرداند.
در تابع cryptoRandom، متغیر bytesSlice برشی از طول رشته مورد نیاز است. حلقه for-range برش بایت را طی می کند و مدول عناصر برش و طول رشته را بر حسب بایت برمی گرداند و بازیابی می کند. ایندکس برش بایت را با شاخص مقدار مدول رشته به روز می کند.
در نهایت، تابع cryptoRandom فرمت رشته قطعه بایت را برمی گرداند.
شما می توانید UUID با Go ایجاد کنید
ایجاد مقادیر تصادفی برای طیف وسیعی از موارد استفاده مفید است. اگر به مقادیر تصادفی و منحصربهفرد زیادی نیاز دارید، میتوانید از UUID استفاده کنید.
UUID (شناسههای منحصربهفرد جهانی) یکتایی جهانی را برای شناسهها تضمین میکنند. میتوانید از آنها برای تمایز بین منابع در سیستمها استفاده کنید و در عین حال از تضاد نامگذاری اجتناب کنید.
بسته های زیادی وجود دارد که می توانید از آنها برای تولید UUID در Go استفاده کنید. می توانید از بسته os برای فراخوانی دستور uuid در سیستم عامل خود استفاده کنید، به بسته UUID Google متوسل شوید یا از بسته gouuid برای تولید UUID استفاده کنید.