سؤال

وأنا أعلم أن مجرد استخدام rand() يمكن التنبؤ به، إذا كنت تعرف ما تفعله، ولديك إمكانية الوصول إلى الخادم.

لدي مشروع وهو للغاية يعتمد على اختيار رقم عشوائي لا يمكن التنبؤ به قدر الإمكان.لذلك أنا أبحث عن اقتراحات، إما وظائف مدمجة أخرى أو وظائف مستخدم، يمكنها إنشاء ملف أحسن رقم عشوائي.

لقد استخدمت هذا لإجراء اختبار صغير:

$i = 0;

while($i < 10000){
    $rand = rand(0, 100);

    if(!isset($array[$rand])){
        $array[$rand] = 1;
    } else {
        $array[$rand]++;
    }

    sort($array);
    $i++;
}

لقد وجدت أن النتائج موزعة بالتساوي، وهناك نمط فردي لعدد المرات التي يتم فيها إنشاء كل رقم.

هل كانت مفيدة؟

المحلول

إن إضافة أو ضرب أو اقتطاع مصدر عشوائي سيئ سيعطيك نتيجة عشوائية سيئة.يرى مقدمة في العشوائية والأرقام العشوائية للحصول على تفسير.

أنت على حق فيما يتعلق بوظيفة PHP rand().انظر الشكل الثاني على تحليل احصائي للحصول على توضيح مذهل.(الرقم الأول ملفت للنظر، ولكن تم رسمه بواسطة سكوت آدامز، ولم يتم رسمه باستخدام rand()).

أحد الحلول هو استخدام مولد عشوائي حقيقي مثل عشوائي.org.آخر، إذا كنت تستخدم Linux/BSD/إلخ.هو الاستخدام /dev/random.إذا كانت العشوائية مهمة حرجة، فسيتعين عليك استخدام ملف الأجهزة مولد عشوائي.

نصائح أخرى

عشوائي.org يحتوي على واجهة برمجة تطبيقات يمكنك الوصول إليها عبر HTTP.

Random.org هي خدمة أرقام عشوائية حقيقية تولد العشوائية عبر الضوضاء الجوية.

سأكون حذرًا من الانطباع بالعشوائية:كانت هناك العديد من التجارب حيث يختار الناس التوزيع الأقل عشوائية.يبدو أن العقل ليس جيدًا جدًا في إنتاج أو تقدير العشوائية.

هناك مقالات جيدة عن العشوائية في فورميلاب, ، بما في ذلك آخر مولد عشوائي حقيقي.ربما يمكنك الحصول على بيانات عشوائية من كلا الموقعين، لذا إذا كان أحدهما معطلاً، فلا يزال لديك الآخر.

كما يوفر Fourmilab برنامج اختبار للتحقق من العشوائية.يمكنك استخدامه للتحقق من برامج myRand() المختلفة.

أما بالنسبة لبرنامجك الأخير، إذا قمت بإنشاء 10000 قيمة، فلماذا لا تختار القيمة النهائية من بين الـ 10 آلاف؟أنت تقيد نفسك بمجموعة فرعية.كما أنه لن يعمل إذا كان $min و$max أكبر من 10000.

على أية حال، العشوائية التي تحتاجها تعتمد على طلبك.سيكون rand() مناسبًا للعبة عبر الإنترنت، ولكنه غير مناسب للتشفير (أي شيء لم يتم اختباره بدقة باستخدام البرامج الإحصائية لن يكون مناسبًا للتشفير على أي حال).ستكون الحكم!

الاختلاف في @KG، باستخدام المللي ثانية منذ EPOCH كبذرة للراند؟

هناك طريقة أخرى للحصول على أرقام عشوائية، تشبه في مفهومها الحصول على UUID

PHP الإصدار 5.3 وما فوق

openssl_random_pseudo_bytes(...)

أو يمكنك تجربة ما يلي مكتبة باستخدام RFC4122

جديد PHP7 هناك وظيفة تقوم بما تحتاجه بالضبط:فإنه يولد أعداد صحيحة عشوائية زائفة آمنة تشفيريا.

int random_int ( int $min , int $max )

يولد أعداد صحيحة عشوائية تشفير مناسبة للاستخدام حيث تكون النتائج غير المتحيزة أمرًا بالغ الأهمية (أيخلط مجموعة البوكر).

للحصول على شرح أكثر تفصيلاً حول PRNG وCSPRNG (والفرق بينهما) بالإضافة إلى سبب كون منهجك الأصلي فكرة سيئة بالفعل، يرجى قراءة ما يلي إجابة أخرى مشابهة للغاية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top