السنة الصينية الجديدة ستأتي قريبًا. تحظى WeChat Red Occores بشعبية كبيرة خلال العام الصيني الجديد. في الآونة الأخيرة ، أراد مشروع أيضًا الاستيلاء على مظاريف حمراء ، لذلك كتبت خوارزمية توليد مغلف أحمر.
متطلبات خوارزمية توليد المغلف الأحمر
إنشاء جميع الأظرف الحمراء مسبقًا أو قم بإنشاء مظروف أحمر واحد بشكل عشوائي إذا طلب واحد
ببساطة ، إنها عملية تحلل عدد صحيح كبير (مباشرة بوحدات "تقسيم" إلى وحدات "، مثل 1 يوان ، أي 100) إلى أعداد صحيحة صغيرة. نطاق الأعداد الصحيحة الصغيرة هو [Min ، Max].
إن أبسط فكرة هي ضمان النتيجة النهائية أولاً ، حيث يحتوي كل مظروف أحمر صغير على دقيقة ، ثم يقوم كل طلب بشكل عشوائي بإنشاء عدد صحيح يتراوح من 0 إلى (الحد الأقصى) ، ثم يضيف دقيقة إلى أموال المغلف الأحمر.
على الرغم من أن هذه الخوارزمية بسيطة ، إلا أنها تحتوي على عيب واحد: قد تكون الأظرف الحمراء التي تم إنشاؤها في النهاية أموالًا دقيقة. وبعبارة أخرى ، قد يكون الظرف الأحمر الأخير هو 0.01 يوان.
هناك طريقة أخرى تتمثل في إنشاء جميع الأظرف الحمراء مسبقًا ، بحيث يكون من الأسهل التحكم فيها. اخترت أن أقوم بإنشاء جميع الأظرف الحمراء مسبقًا.
خوارزمية جيل الظرف الأحمر المثالي
تتمثل نتيجة توليد الظرف الأحمر المثالي في وجود المزيد من الأظرف الحمراء بالقرب من متوسط القيمة ، وهناك عدد قليل نسبيًا من الأظرف الحمراء الكبيرة والأظرف الحمراء الصغيرة.
كما يمكنك أن تتخيل ، فإن توزيع عدد الحزم الحمراء التي تم إنشاؤها يشبه التوزيع العادي إلى حد ما.
إذن كيف تحقق هذا الشرط لمزيد من القيم بالقرب من الخط المتوسط؟
إنه للعثور على خوارزمية يمكن أن تزيد من الاحتمال حول المتوسط. ثم استخدم طريقة "التوسع" و "الانكماش" لتحقيق هذا التأثير.
إذا كنت مربعًا لأول مرة ، ثم قم بإنشاء أرقام عشوائية في النطاق المربع ، ثم مربعًا ، فلن يكون الاحتمال متوسطًا.
خوارزمية محددة:
الطبقة العامة hongbaoalgorithm {ثابت عشوائي عشوائي = جديد عشوائي () ؛ static {randomsetseed (SystemCurrentTimeMillis ()) ؛ } public static void main (string [] args) {long max = 200 ؛ طويل دقيقة = 1 ؛ Long [] نتيجة = Hongbaoalgorithmenerate (100_0000 ، 10_000 ، Max ، Min) ؛ إجمالي طويل = 0 ؛ لـ (int i = 0 ؛ i <resultLength ؛ i ++) {// systemoutPrintln ("result [" + i + "]:" + result [i]) ؛ // systemeMoutPrintln (النتيجة [i]) ؛ المجموع += النتيجة [i] ؛ }. // احسب عدد الحزم الحمراء لكل أموال وتحقق مما إذا كانت قريبة من توزيع int العادي [] = جديد [(int) بحد أقصى + 1] ؛ لـ (int i = 0 ؛ i <resultLength ؛ i ++) {count [(int) result [i]]+= 1 ؛ } لـ (int i = 0 ؛ i <countLength ؛ i ++) {systemeMoutPrintln ("" + i + "" + count [i]) ؛ }} /*** تنتج أرقامًا عشوائية بين دقيقة و Max ، ولكن الاحتمال ليس متوسطًا ، ويزداد احتمال الاتجاه من Min إلى Max تدريجياً. * المربع الأول ، ثم قم بإنشاء رقم عشوائي داخل نطاق القيمة المربعة ، ثم يربطه ، والذي ينتج عنه تأثير "التوسع" و "الانكماش". * * param min * param max * regurn */ static long xRandom (long min ، long max) {return sqrt (nextlong (sqr (max - min))) ؛ } / ***** param إجمالي* إجمالي مبلغ المغلف الأحمر* @param عدد الأظرف الحمراء* param max* أقصى كمية من كل مظروف أحمر صغير* @param min* الحد الأدنى من كل مظروف أحمر صغير* revray منذ فترة طويلة [long] متوسط متوسط = إجمالي / العد ؛ طويل A = متوسط - دقيقة ؛ طويل ب = الحد الأقصى - دقيقة ؛ // // لقد تغير احتمال وجود هذا الرقم العشوائي بالفعل ، وإمكانية توليد عدد كبير أصغر من احتمال توليد رقم عشري. // هذا يحقق أن معظم الأظرف الحمراء لها القيمة حول المتوسط. هناك عدد أقل من الأظرف الحمراء الكبيرة والأظرف الحمراء الصغيرة. المدى الطويل 1 = SQR (متوسط - دقيقة) ؛ المدى الطويل 2 = SQR (الحد الأقصى - المتوسط) ؛ لـ (int i = 0 ؛ i <resultLength ؛ i ++) {// لأن عدد الأظرف الحمراء الصغيرة عادة ما يكون أعلى من عدد الأظرف الحمراء الكبيرة ، لأن الاحتمال هنا يجب تغييره. // عندما يكون متوسط القيمة العشوائية> متوسط القيمة ، يتم إنشاء مظروف أحمر صغير // عندما يكون الرقم العشوائي <القيمة المتوسطة ، يتم إنشاء مظروف أحمر كبير إذا (nextlong (min ، max)> mepality) {// تقليل الأموال على الخط المتوسط // temp = min + sqrt (nextlong (range1)) ؛ temp = min + xrandom (دقيقة ، متوسط) ؛ النتيجة [i] = temp ؛ المجموع -= درجة الحرارة ؛ } آخر {// إضافة أموال على خط متوسط // temp = max - sqrt (nextlong (range2)) ؛ temp = max - xrandom (متوسط ، كحد أقصى) ؛ النتيجة [i] = temp ؛ المجموع -= درجة الحرارة ؛ }} // إذا كان لا يزال هناك أموال متبقية ، فحاول إضافتها إلى الظرف الأحمر الصغير. إذا كان لا يمكن إضافته ، جرب واحد التالي. بينما (total> 0) {for (int i = 0 ؛ i <resultLength ؛ i ++) {if (total> 0 && result [i] <max) {result [i] ++ ؛ المجموع--؛ }}} // إذا كان المال سلبيًا ، فيجب عليك التراجع من الظرف الأحمر الصغير الذي تم إنشاؤه بينما (إجمالي <0) {for (int i = 0 ؛ i <resultLength ؛ i ++) {if (total <0 && result [i]> min) {result [i]-؛ المجموع ++ ؛ }}} نتيجة الإرجاع ؛ } static long sqrt (long n) {// تم تحسينه إلى البحث عن الجدول؟ إرجاع (طويل) MathSqrt (N) ؛ } static long sqr (long n) {// هل يبحث الجدول بسرعة ، أم أنه محسوب مباشرة بسرعة؟ العودة n * n ؛ } static long nextlong (long n) {return RandomNextInt ((int) n) ؛ } static long nextlong (long min ، long max) {returnnextint ((int) (max - min + 1)) + min ؛ }}بعد حساب النتائج التي تم إنشاؤها ، فإنها تتماشى تمامًا مع المتطلبات.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.