أفضل طريقة لحساب إذا كان هناك 1/4 فرصة شيئا ما سيحدث في C++?

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

  •  11-07-2019
  •  | 
  •  

سؤال

أنا أتساءل عما إذا كان هناك طريقة ذكية لمعرفة

هناك 1/4 فرصة يحدث شيء.

وأنا أعلم أننا يمكن أن تفعل هذا مع rand() % 4 والتحقق إذا كان يساوي 0 ، ولكن هل هناك طريقة بدون استخدام راند()?في c++, شكرا.

لا يوجد حل صحيح

نصائح أخرى

إذا كنت تعني أنك تريد تجنب crappiness ملازمة للعديد من تطبيقات rand()، ربما يجب عليك النظر في <لأ href = "http://www.boost.org/doc/libs/1_37_0/libs/random/index. أتش تي أم أل "يختلط =" نوفولو noreferrer "> وتفعيل مكتبة عشوائية ، التي لديها العديد pRNGs عالية الجودة (عدد شبه عشوائي المولدات)، والعديد من الطرق للسيطرة على الانتاج. هذه المكتبة موجودة أيضا في صيغة معدلة بشكل طفيف في std::tr1.

أبدا من أي وقت مضى استخدام % على اقتطاع PRNG قيمة في مجموعة.معظم PRNGs نسبيا غير عشوائية أمر الدنيا بت.

عن قضيتك ، واستخدام شعبة (RAND_MAX / n) مثل BCS يوحي.

rand() < RAND_MAX/n;

واختيار أفضل راند () من لC إذا كنت لا تحب راند C القياسية ().

هل يمكن كتابة راند الخاصة بك. (لا تفعل ذلك).
هل يمكن انتزاع tickcount. (لا تفعل ذلك في كثير من الأحيان).
هل يمكن أن نعول فقط، وكل مكالمة الرابعة عودة صحيح.

وأنت ربما ينبغي أن مجرد دعوة راند ().

وأنا لا أعرف الكثير C ++، لذلك قد يكون من الخطأ. ولكن يبدو rand() إرجاع قيمة بين 0 وRAND_MAX-1. لذلك ربما يمكنك أن تفعل شيئا من هذا القبيل:

double odds = .25;

if(rand() <= RAND_MAX * odds) {
    // there should be .25 chance of entering this condition
}

وPS: ربما هذا يتطلب بعض صب

.

لماذا لا تستخدم راند ()؟ إذا كنت تشعر بالقلق إزاء العشوائية "الحقيقي" مقابل العشوائية الزائفة، يمكنك محاولة <لأ href = "http://15359.blogspot.com/2008/11/lecture-24-on-getting-random-bits.html" يختلط = "نوفولو noreferrer"> استخدام مصادر المادية للبت عشوائية . أكثر من ذلك بكثير تعقيدا، وعادة ما تكون غير ضرورية.

هل يمكن استخدام نوع آخر من RNG مثل ميرسين الاعصار التي لديها أفضل الكون الكلي . وأود أيضا أن نسمع الشيء الجيد Multuply مع RNGs كاري .

و4 هو حالة خاصة. يمكن أن نفترض أن PRNG بك وقد حصلت على 50٪ من فرص إخراج عدد زوجي، كما هو الحال - أعتقد - لLCG من LIBC (راند). احتمال إخراج عدد زوجي مرتين ولذلك 25٪.

وذلك ...

bool rand_afourth(void)
{
    return !!((rand() & 1) & (rand() & 1));
}

والآن لمتحذلق ...

وما تريد القيام به هو أن يكون هناك عشوائية موحدة ولدت، ولكن تقتصر على طائفة معينة، في هذه الحالة على الكون من 4. إذا PRNG لديه، ويقول، والكون من 32 بت، لا يمكنك أن تكون على يقين من أن سوف حساب الناتج زارة الدفاع 4 تعمل كما هو متوقع. هذا يتطلب العمل أكثر قليلا.

لحسن الحظ، وبالفعل تم تنفيذ هذا العمل في المكتبة دفعة.

boost::uniform_int<> aFourth(1,4)

وكنت على سبيل المثال يقول "موافق" في كل مرة تحصل على 1 (أو 2، 3، 4، كما كنت يتوهم).

ولكن قد لا تحتاج إلى استخدام المكتبة دفعة. ثم، ببساطة النظر في مدونة uniform_int و إنتاج السلوك. مواهب تقليد، عباقرة سرقة. ؛)

أم...الكتابة الخاصة بك rand()?سوف تحتاج بعض نوع من العشوائية وظيفة!

وجرب:

static int r = 0;
: : :
if ((r = (r+1)%4) == 0) {
    // do something.
}

وبعد ذلك ستجد أنها تعطيك الكمال 25٪ احتمال شيء يحدث (على افتراض انك تنفيذ-بيان ما إذا كان مضاعف أربع مرات.

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