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

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

  •  02-07-2019
  •  | 
  •  

سؤال

الرمز هو

return min + static_cast<int>(static_cast<double>(max - min + 1.0) *
  (number / (UINT_MAX + 1.0)));

الرقم هو رقم عشوائي تم الحصول عليه بواسطة rand_s.الحد الأدنى والحد الأقصى هما عدد صحيح ويمثلان الحد الأدنى والحد الأقصى للقيم (شاملة).

إذا قدمت حلاً لعدم استخدام unsigned int كرقم، فيرجى أيضًا توضيح كيفية جعله عشوائيًا.

من فضلك لا ترسل الحلول باستخدام rand ().

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

المحلول

ال static_cast<double> زائدة عن الحاجة لأن "+1.0" ستؤدي إلى مضاعفة الترويج على أي حال.

نصائح أخرى

@أندرو شتاين

في الوصفات العددية في C:فن الحوسبة العلمية (وليام ه.الصحافة، بريان P.فلانري، شاول أ.تيكولسكي، ويليام ت.فيترلينج؛نيويورك:مطبعة جامعة كامبريدج، 1992 (الطبعة الثانية، ص.277))، وإبداء التعليقات التالية:

"إذا كنت ترغب في إنشاء عدد صحيح عشوائي بين 1 و 10 ، فيجب عليك دائمًا القيام بذلك باستخدام أجزاء عالية الترتيب ، كما في

j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

وليس بأي شيء يشبه

j = 1 + (rand() % 10);

(الذي يستخدم البتات ذات الترتيب الأدنى)."

من man 3 rand

يمكنك إجراء العمليات الحسابية بطريقة طويلة غير موقعة بدلاً من مزدوجة، ولكن فقط إذا كان ULONGLONG_MAX >= UINT_MAX*UINT_MAX، والذي من المحتمل أن يكون التنفيذ محددًا.ولكن إذا كنت قلقًا بشأن ذلك، فستكون قلقًا بشأن احتمال فقدان الدقة في الكود الأصلي في الحالة التي يكون فيها (max - min) أو RAND_MAX كبيرًا.

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

شيء مثل

min + number % (max - min + 1)

تحقق من الحالات النهائية

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