المواضيع الرائجة
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
في حلقة اليوم من برنامج الرعب البرنامجي...
في وثائق بايثون الخاصة ب random.seed() def، قيل لنا
"إذا كانت a ذكاء، تستخدم مباشرة." [1]
لكن إذا قمت بزرع 3 أو -3، تحصل فعليا على نفس كائن العشوائية بالضبط، وينتج نفس التدفقات. (حتى اليوم). في nanochat كنت أستخدم الإشارة كطريقة (ما اعتقدت أنها) ذكية للحصول على تسلسلات عشوائية مختلفة لتقسيم القطارات/الاختبار. ومن هنا جاء خطأ خطير لأن القطار = الاختبار الآن.
وجدت أن كود CPython مسؤول عن cpython/Modules/_randommodule.c [2]، حيث نراها في السطر 321 في تعليق:
"هذه الخوارزمية تعتمد على أن الرقم غير موقع. إذا: إذا كان الأرج هو باي لونغ، استخدم قيمته المطلقة." يليه
n = PyNumber_Absolute(arg);
الذي يستدعي صراحة abs() على بذرتك لجعلها موجبة، مع التخلص من بت الإشارة.
لكن هذا التعليق في الواقع خاطئ ومضلل أيضا. تحت الغطاء، تسمي بايثون خوارزمية Mersenne Twister MT19937، والتي في الحالة العامة تحتوي على حالة 19937 (غير صفرية) بت. بايثون تأخذ الاستخبارات (أو الكائنات الأخرى) و"توزع" تلك المعلومات عبر هذه الأجزاء. من حيث المبدأ، كان من الممكن استخدام بت الإشارة لتعزيز بتات الحالة. لا يوجد شيء في الخوارزمية "يعتمد على أن الرقم غير موقع". تم اتخاذ قرار بعدم دمج جزء الإشارة (والذي برأيي كان خطأ). مثال بسيط يمكن أن يكون تحويل n -> 2*abs(n) + int(n < 0).
وأخيرا يقودنا هذا إلى عقد العشوائية في بايثون، والذي لم يتم توضيحه بالكامل في الوثائق. العقد المذكور هو:
نفس البذرة = > نفس التسلسل.
لكن لا يوجد ضمان بأن البذور المختلفة تنتج تسلسلات مختلفة. لذا من حيث المبدأ، لا تعد بايثون بأن مثلا seed(5) و seed(6) هما تدفقات عشوائية مختلفة. (مع أن هذا غالبا ما يفترض ضمنيا في العديد من التطبيقات.) في الواقع، نرى أن seed(5) و seed(-5) هما جداول متطابقة. وربما لا يجب عليك استخدامها لفصل سلوكيات التدريب أو الاختبار في تعلم الآلة. واحدة من أكثر أسلحة الرعب البرمجية طرافة التي صادفتها مؤخرا. سنراكم في الحلقة القادمة.
[1]
[2]

الأفضل
المُتصدِّرة
التطبيقات المفضلة

