توفر الحزمة rand64 مولدات أرقام عشوائية زائفة تنتج أرقام 64 بت غير موقعة في النطاق [0، 2 64 ].
يتم توفير تطبيقات مولدات الأرقام العشوائية الزائفة التالية في حزمها الخاصة:
تقوم هذه المولدات بتنفيذ rand.Source64، لذا يمكن استخدامها كمصدر لـ rand.Rand (اعتبارًا من Go 1.8).
لاحظ أن بعض الخوارزميات تستفيد من حزمة البتات من Go 1.9.
يبدو إنشاء PRNG كما يلي:
// create a source with the xoshiro256**
source := &xoshiro.Rng256SS{}
// use it as a source in rand.New
rng := rand.New(&source)
// Seed it from a single int64 (negative values are accepted)
rng.Seed(int64Seed)
هذه نسخة ذات زيادة ثابتة من مولد SplittableRandom الخاص بـ Java 8. راجع أيضًا الصفحة الخاصة بمولدات الأرقام العشوائية الزائفة السريعة القابلة للتقسيم.
انتقل إلى التنفيذ بناءً على التنفيذ المرجعي لـ C بواسطة Sebastiano Vigna.
الفترة 2 256 -1
وفقًا لمؤلفي الخوارزمية:
xoshiro256** (XOR/shift/rotate) هو مولدنا القوي متعدد الأغراض (على الرغم من أنه ليس مولدًا آمنًا للتشفير). يتمتع بسرعة (sub-ns) ممتازة، ومساحة حالة (256 بت) كبيرة بما يكفي لأي تطبيق موازٍ، ويجتاز جميع الاختبارات التي نعرفها.
ومع ذلك، إذا كان يتعين على المرء إنشاء أرقام الفاصلة العائمة 64 بت فقط (عن طريق استخراج الـ 53 بت العلوية)، فإن xoshiro256+ هو مولد أسرع قليلاً (≈15٪) مع خصائص إحصائية مماثلة. للاستخدام العام، يجب على المرء أن يأخذ في الاعتبار أن أدنى بتات لديها تعقيد خطي منخفض وسوف تفشل في اختبارات الخطية؛ ومع ذلك، فإن التعقيد الخطي المنخفض لا يكاد يكون له أي تأثير في الممارسة العملية، وبالتأكيد ليس له أي تأثير على الإطلاق إذا قمت بإنشاء أرقام الفاصلة العائمة باستخدام البتات العليا (لقد قمنا بحساب تقدير دقيق للتعقيد الخطي للبتات الأدنى).
الفترة 2 128 -1
وفقًا لمؤلفي الخوارزمية:
xoroshiro128** (XOR/rotate/shift/rotate) وxoroshiro128+ لهما نفس السرعة مثل xoshiro256 ويستخدمان نصف المساحة؛ تنطبق نفس التعليقات. وهي مناسبة فقط للتطبيقات المتوازية ذات النطاق المنخفض؛ علاوة على ذلك، يُظهر xoroshiro128+ اعتماداً بسيطًا في أوزان Hamming مما يؤدي إلى فشل بعد 5 تيرابايت من الإخراج في اختبارنا. نعتقد أن هذا التحيز الطفيف لا يمكن أن يؤثر على أي تطبيق.
انتقل إلى التنفيذ بناءً على التنفيذ المرجعي للغة C بواسطة David Blackman وSebastiano Vigna.
لمزيد من المعلومات، قم بزيارة مولدات xoshiro / xoroshiro وصفحة تبادل إطلاق النار PRNG.
الفترة 2128
هذا هو مولد متطابق متبدل كما هو محدد في
PCG: عائلة من الخوارزميات البسيطة والسريعة والموفرة للمساحة والجيدة إحصائيًا لتوليد الأرقام العشوائية
ميليسا إي أونيل، كلية هارفي مود
https://www.cs.hmc.edu/tr/hmc-cs-2014-0905.pdf
بينما يشير PCG
إلى عائلة كاملة من الخوارزميات (انظر أيضًا http://pcg-random.org)، فإن الخوارزمية الوحيدة المتوفرة هي PCG XSL RR 128/64 LCG.
ابدأ التنفيذ بناءً على التنفيذ المرجعي للغة C بواسطة ميليسا أونيل والمساهمين في مشروع PCG.
الفترة 2 19937 -1
هذا تطبيق Go خالص يعتمد على تطبيق mt19937-64.c C بواسطة ماكوتو ماتسوموتو وتاكوجي نيشيمورا.
مزيد من المعلومات حول خوارزمية Mersenne Twister والتطبيقات الأخرى متاحة على http://www.math.sci.hiroSHIMA-u.ac.jp/~m-mat/MT/emt.html
لاحظ أن هذه الخوارزمية مخصصة فقط للتطبيقات التي تحتاج إلى إمكانية التشغيل التفاعلي مع التطبيقات الأخرى التي تستخدم نفس هذه الخوارزمية. وبما أنه من المعروف أنه يفشل في الاختبارات الإحصائية التافهة وهو الأبطأ على AMD64، فلا يوصى باستخدامه لأي غرض آخر.
ليس PRNG فعليًا.
حزمة IoRand عبارة عن غلاف بسيط لقراءة تدفقات البايت عبر io.Reader. يمكن استخدامه كغلاف حول العملة المشفرة/الراند لإنشاء راند.Source64 لحزمة الرياضيات/الراند:
package main
import (
"bufio"
crand "crypto/rand"
"encoding/binary"
"math/rand"
"github.com/db47h/rand64/v3/iorand"
)
// Wrap crypto/rand in an IoRand
func main () {
// first, wrap crypto/rand.Reader in a buffered bufio.Reader
bufferedReader := bufio . NewReader ( crand . Reader )
// Create the new IoRand Source
ior := iorand . New ( bufferedReader , binary . LittleEndian )
// use it as rand.Source64
rng := rand . New ( ior )
// get random numbers...
for i := 0 ; i < 4 ; i ++ {
_ = rng . Uint64 ()
}
}
تم تنفيذ هذه المعايير باستخدام go 1.12.5.
خوارزمية | ايه ام دي FX-6300 | كور آي5 6200 يو | معالج Cortex-A7 بسرعة 900 ميجاهرتز |
---|---|---|---|
زوشيرو256** | 5.53 نانو ثانية / المرجع | 106.0 نانو ثانية / المرجع | |
xoshiro256+ | 5.48 نانو ثانية / المرجع | 86.1 نانو ثانية / المرجع | |
xoroshiro128** | 5.16 نانو ثانية / المرجع | 79.2 نانو ثانية / المرجع | |
xoroshiro128+ | 5.15 نانو ثانية / المرجع | 62.7 نانو ثانية / المرجع | |
PCG XSL RR 128/64 LCG | 5.29 نانو ثانية / المرجع | 254.0 نانو ثانية / المرجع | |
com.splitmix64 | 4.30 نانو ثانية / المرجع | 77.5 نانو ثانية / المرجع | |
ميرسين تويستر 19937 | 8.82 نانو ثانية / المرجع | 136.0 نانو ثانية / المرجع | |
اذهب إلى الرياضيات / راند | 7.01 نانو ثانية / المرجع | 68.4 نانو ثانية / المرجع |
لاحظ أن المعايير تظهر أداء أبطأ مقارنة بالإصدارات السابقة. ويرجع ذلك إلى حقيقة أننا قمنا باستدعاء Rng.Uint64 مباشرةً بدلاً من المرور عبر واجهة rand.Rand64. من أجل إجراء مقارنة عادلة مع rng لمكتبة Go القياسية، تمر جميع المعايير الآن عبر واجهة rand.Source64.
ابتعد عن Splitmix64 و Mersenne-Twister 19937 الموقرة.
لا يُعرف سوى القليل جدًا عن الرياضيات/الراند الخاصة بـ Go (انظر هنا، هنا) وهناك اقتراح لاستبدالها بمولد PCG.
تتميز أجهزة PCG وxoshiro256** وxoroshiro128** المتوفرة بسمعتها الطيبة في اجتياز جميع الاختبارات المعروفة؛ وفقا لمؤلفيها. انتبه إلى الأداء الضعيف لخوارزمية PCG هذه على الأنظمة الأساسية 32 بت (التي تؤثر على كل من ARM وx86).
يدعم Rand64 وحدات go. تم نقل الإصدارات السابقة 1.x و2.x إلى الفروع الخاصة بها. نظرًا لأن علامات semver التي لا تحتوي على go.mod بدت وكأنها تزعج وحدات go، فقد تمت إعادة تعيين العلامات الخاصة بهذه الإصدارات.
تم إصدار هذه الحزمة بموجب شروط ترخيص ISC (راجع ملف الترخيص الموجود في جذر المستودع). علاوة على ذلك، فإن استخدام الخوارزميات التالية يخضع لتراخيص إضافية: