احصل على رقم عشوائي يتوافق/لا يطابق المعايير (PHP)

StackOverflow https://stackoverflow.com/questions/1039400

  •  22-07-2019
  •  | 
  •  

سؤال

باستخدام PHP (نرحب باللغات الأخرى، ونرحب باستخدام العناصر المدمجة الشائعة)، كيف يمكنني الحصول على رقم عشوائي (أو شبه عشوائي) لا يتطابق مع معايير معينة؟

أي:أريد $x = rand(0, 99) ولكن فقط إذا ($x % 9) != 0.

ما هي الطريقة المقبولة النظيفة لتقييد الأرقام العشوائية بمعايير كهذه؟

على سبيل المثال، باستخدام أ while() حلقة، وربما breakعندما يكون لدينا شيء يلبي معاييرنا، ثم نستخدم الرقم العشوائي بعد الحلقة ؟:

while ( ($rand_key = array_rand($array_of_items)) && ($rand_key % 9 == 0) ) 
{ 
    // Do nothing?
}

أو شيء من هذا القبيل:

while ( $rand_key = array_rand($array_of_items) ) 
{ 
    if ( $rand_key % 9 == 0 ) {
        break;
    }
}

أم أن هناك طريقة أكثر إيجازًا أو مناسبة لتحقيق ذلك؟

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

المحلول

واحدة من الحالات النادرة حيث حلقة افعل بينما يساعد فعلا

$testData = array( 7, 8, 9 );

do {
  $rand = array_rand( $testData );
} while ( $testData[$rand] % 9 == 0 );

echo $testData[$rand];

نصائح أخرى

هل هذه حالة الاستخدام الخاصة بك بالضبط أم مجرد مثال؟

إذا كنت تحاول (على وجه الخصوص) الحصول على أرقام من 0 إلى 99 باستثناء المضاعفات الدقيقة للرقم 9، فيمكنني التفكير في طريقتين لتجنب التكرار المحرج.لا يحب الأشخاص التكرار أثناء إنشاء أرقام عشوائية لأنه يمكنك التكرار إلى الأبد.(لكن هذا لن يحدث بالطبع إلا إذا كنت من النوع سيئ الحظ للغاية - ذلك النوع من الأشخاص الذي يصادف أنه يدخل في معارك بالأسلحة النارية مع كلينت إيستوود في أفلام السباغيتي الغربية.)

  1. يمكن أن يكون لديك جدول بحث يعيد تجديد الأرقام العشوائية التي تحصل عليها في الأرقام التي تريدها.

  2. توليد 0-88 بشكل عشوائي.اضرب النتيجة بمقدار 9 وقسمها على 8 وحصل على نتيجة عدد صحيح (الأرضية ، وليس مستديرة).ثم أضف 1.

كلاهما لهما توقيت يمكن التنبؤ به.

سوف

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

وأيا كانت الطريقة التي تختارها أنا أقترح أيضا، لرمز الإنتاج، مشيرا الى ان السبب في تقييد بطريقة مناسبة وسهلة المنال.

وهذا يتطابق مع متطلبات "موجزة":

while( ($x = rand(0, 99)) % 9 == 0 );
echo $x;

أو

while ( $array_of_items[$rand_key = array_rand($array_of_items)] % 9 == 0 ); 
echo $array_of_items[$rand_key];     

ومع ذلك، فمن غير قابل للقراءة للغاية.

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