সঠিকভাবে লুপগুলি ছাড়া প্রচুর ডাইস রোলগুলি অনুকরণ করে?


14

ঠিক আছে সুতরাং যদি আপনার গেমটি প্রচুর ডাইস রোল করে তবে আপনি কেবল একটি লুপে একটি এলোমেলো নম্বর জেনারেটর কল করতে পারেন। তবে যে কোনও ধরণের ডাইসের ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন পেটের জন্য আপনি বিতরণ কার্ভ / হিস্টগ্রাম পাবেন। সুতরাং আমার প্রশ্নটি কি আমি চালাতে পারি একটি দুর্দান্ত সরল গণনা যা আমাকে এমন একটি নম্বর দেবে যা সেই বন্টনকে ফিট করে?

যেমন 2D6 - স্কোর -% সম্ভাবনা

2 - 2.77%

3 - 5.55%

4 - 8.33%

5 - 11.11%

6 - 13.88%

7 - 16.66%

8 - 13.88%

9 - 11.11%

10 - 8.33%

11 - 5.55%

12 - 2.77%

সুতরাং উপরের জিনিসগুলি জেনে আপনি একক d100 রোল করতে পারেন এবং সঠিক 2D6 মান কার্যকর করতে পারেন। তবে একবার আমরা 10D6, 50D6, 100D6, 1000D6 দিয়ে শুরু করলে এটি প্রসেসিংয়ের অনেক সময় বাঁচাতে পারে। সুতরাং একটি টিউটোরিয়াল / পদ্ধতি / অ্যালগরিদম থাকতে হবে যা এই দ্রুত করতে পারে? এটি সম্ভবত শেয়ার বাজার, ক্যাসিনো, কৌশল গেমস, বামন দুর্গ ইত্যাদির পক্ষে কার্যকর যদি আপনি সম্পূর্ণ কৌশলগত যুদ্ধের ফলাফলগুলি অনুকরণ করতে পারেন যে এই ফাংশনটিতে কয়েকটি কল এবং কিছু প্রাথমিক গণিতের সাথে খেলতে কয়েক ঘন্টা সময় লাগতে পারে?


5
এমনকি 1000 ডি 6 এ, লুপটি একটি আধুনিক পিসিতে যথেষ্ট দ্রুত হবে যা আপনি এটির নজরে আসার সম্ভাবনা রাখেন না, তাই এটি অকাল অপটিমাইজেশন হতে পারে। একটি অস্বচ্ছ সূত্রের সাথে পরিষ্কার লুপটি প্রতিস্থাপনের আগে সর্বদা প্রোফাইল করার চেষ্টা করুন। বলেছিল, অ্যালগরিদমিক বিকল্প রয়েছে are আপনি কি উদাহরণ হিসাবে ডাইসের মতো স্বতন্ত্র সম্ভাবনা সম্পর্কে আগ্রহী, বা এগুলি একটি অবিচ্ছিন্ন সম্ভাবনা বন্টন হিসাবে মডেল করা গ্রহণযোগ্য (যাতে 2.5 এর মতো একটি ভগ্নাংশ ফলাফল সম্ভব হতে পারে)?
ডিএমগ্রিগরি

ডিএমগ্রিগরি সঠিক, 1000d6 গণনা করা কোনও প্রসেসরের হগের বেশি হবে না। তবে, দ্বিপদী বিতরণ নামে একটি জিনিস রয়েছে যা আপনার আগ্রহী ফলাফলটি পাবেন (কিছু চালাক কাজের সাথে) Also এছাড়াও, আপনি যদি কখনও কোনও স্বেচ্ছাচারী রোল রুলসেটের সম্ভাবনাগুলি খুঁজে পেতে চান তবে ট্রল চেষ্টা করুন যা একটি পরিমিত ভাষা রয়েছে কিভাবে পাশা সেট সেট রোল এবং এটি সম্ভাব্য সমস্ত সম্ভাব্য ফলাফল গণনা করা হবে জন্য সেট সেট।
ড্রাকো

একটি পয়সন বিতরণ ব্যবহার করুন: পি।
লুইস মাসুয়ালি

1
ডাইসের কোনও সেট প্রায়শই যথেষ্ট ঘূর্ণিত হওয়ার জন্য আপনি সম্ভবত একটি বিতরণ কার্ভ / হিস্টোগ্রাম পাবেন। এটি একটি গুরুত্বপূর্ণ পার্থক্য। একটি পাশা এক সারিতে এক মিলিয়ন 6s রোল করতে পারে, এটি অসম্ভব, তবে এটি পারে
রিচার্ড টিঙ্গল

@ রিচার্ডটিঙ্গল আপনি কি বিস্তারিত বর্ণনা করতে পারেন? বিতরণ কার্ভ / হিস্টোগ্রামে "এক মিলিয়ে 6 মিলিয়ন" কেও অন্তর্ভুক্ত করা হবে।
amitp

উত্তর:


16

আমি উপরের আমার মন্তব্যে যেমন উল্লেখ করেছি, আপনার কোডকে অতিরিক্ত জটিলতার আগে আপনাকে প্রোফাইল দেওয়ার পরামর্শ দিচ্ছি। forজটিল গণিতের সূত্রগুলি এবং টেবিল-বিল্ডিং / অনুসন্ধানের চেয়ে দ্রুত লুপের সামিং ডাইস বোঝা ও সংশোধন করা অনেক সহজ। আপনি গুরুত্বপূর্ণ সমস্যাগুলি সমাধান করছেন তা নিশ্চিত করতে সর্বদা প্রথমে প্রোফাইল দিন। ;)

এটি বলেছে যে, একটি ঝরে যাওয়ার মধ্যে অত্যাধুনিক সম্ভাবনা বিতরণের নমুনার দুটি প্রধান উপায় রয়েছে:


1. সংশ্লেষ সম্ভাবনা বন্টন

আছে একটি ঝরঝরে কৌতুক একটানা সম্ভাব্যতা ডিস্ট্রিবিউশন থেকে নমুনা শুধুমাত্র একটি একক অভিন্ন র্যান্ডম ইনপুট ব্যবহার দ্বারা । এটি ক্রমবর্ধমান বিতরণ , ফাংশনটির সাথে সম্পর্কিত যা " x এর চেয়ে বেশি মূল্য পাওয়ার সম্ভাবনা কী ?"

এই ফাংশনটি হ্রাস পাচ্ছে না, 0 থেকে শুরু হয়ে এর ডোমেনের উপরে 1 এ বাড়ছে। দুটি ছয়-পার্শ্বযুক্ত পাশ্বের যোগফলের উদাহরণ নীচে দেখানো হয়েছে:

সম্ভাবনার গ্রাফগুলি, ক্রমবর্ধমান বিতরণ এবং 2 ডি 6 এর বিপরীতে

যদি আপনার ক্রমবর্ধমান বিতরণ ফাংশনটিতে সুবিধাজনক-থেকে-গণনা বিপরীতমুখী থাকে (বা আপনি এটি বাজিয়ার কার্ভগুলির মতো টুকরোজ ফাংশনগুলির সাথে আনুমানিক করতে পারেন), আপনি এটি মূল সম্ভাব্যতা ফাংশন থেকে নমুনা হিসাবে ব্যবহার করতে পারেন।

বিপরীতমুখী ফাংশনটি 0 থেকে 1 এর মধ্যে ডোমেনটিকে অন্তর অন্তর অন্তর্ভুক্ত করে মূল র্যান্ডম প্রক্রিয়াটির প্রতিটি আউটপুটে ম্যাপ করা হয়, যার প্রতিটিটির আঞ্চলিক সম্ভাবনার সাথে মিল থাকে। (অবিচ্ছিন্ন বিতরণের জন্য এটি অসীম সত্য d ডাইস রোলসের মতো বিচ্ছিন্ন বিতরণের জন্য আমাদের সতর্কতার সাথে বৃত্তাকার প্রয়োগ করতে হবে)

2d6 অনুকরণ করতে এটি ব্যবহারের উদাহরণ এখানে:

int SimRoll2d6()
{
    // Get a random input in the half-open interval [0, 1).
    float t = Random.Range(0f, 1f);
    float v;

    // Piecewise inverse calculated by hand. ;)
    if(t <= 0.5f)
    {
         v = (1f + sqrt(1f + 288f * t)) * 0.5f;
    }
    else
    {
         v = (25f - sqrt(289f - 288f * t)) * 0.5f;
    }

    return floor(v + 1);
}

এর সাথে তুলনা করুন:

int NaiveRollNd6(int n)
{
    int sum = 0;
    for(int i = 0; i < n; i++)
       sum += Random.Range(1, 7); // I'm used to Range never returning its max
    return sum;
}

কোডের স্বচ্ছতা এবং নমনীয়তার পার্থক্য সম্পর্কে আমি কী বুঝি? নিষ্পাপ উপায়টি এর লুপগুলির সাথে নিখুঁত হতে পারে তবে এটি সংক্ষিপ্ত এবং সহজ, এটি কী করে তা অবিলম্বে সুস্পষ্ট এবং বিভিন্ন ডাই আকার এবং সংখ্যায় স্কেল করা সহজ। ক্রমবর্ধমান ডিস্ট্রিবিউশন কোডে পরিবর্তন আনার জন্য কিছু অ-তুচ্ছ গণিতের প্রয়োজন হয়, এবং কোনও স্পষ্ট ভুল ছাড়াই এটি ভাঙ্গা এবং অপ্রত্যাশিত ফলাফল আনতে সহজ হবে। (যা আমি আশা করি আমি উপরে তৈরি করিনি)

সুতরাং, আপনি পরিষ্কার লুপটি সরিয়ে নেওয়ার আগে একেবারে নিশ্চিত হয়ে নিন যে এই ধরণের ত্যাগের মূল্যবান একটি কার্যত সমস্যা।


২.আলিয়াস পদ্ধতি

যখন আপনি একটি সাধারণ গণিতের প্রকাশ হিসাবে ক্রমবর্ধমান বিতরণ ফাংশনের বিপরীতটি প্রকাশ করতে পারেন তখন संचयी বিতরণ পদ্ধতিটি ভালভাবে কাজ করে তবে এটি সর্বদা সহজ বা এমনকি সম্ভব নয়। বিযুক্ত ডিস্ট্রিবিউশন জন্য একটি নির্ভরযোগ্য বিকল্প কিছু বলা হয় ওরফে পদ্ধতি

এটি আপনাকে কেবল দুটি স্বতন্ত্র, অভিন্ন বিতরণ করা এলোমেলো ইনপুট ব্যবহার করে যেকোন স্বেচ্ছাসেবী বিচ্ছিন্ন সম্ভাবনা বিতরণ থেকে নমুনা দেয়।

এটি বাম দিকে নীচের মত একটি বিতরণ নিয়ে কাজ করে (যে ক্ষেত্রগুলি / ওজনগুলি 1 এর সমান হয় না তা ভেবে দেখবেন না ) যে তুলনামূলকভাবে ওজন সম্পর্কে আমাদের যত্নশীল এলিয়াস পদ্ধতির জন্য ) এবং এটির মতো একটি টেবিলে রূপান্তরিত করে ঠিক যেখানে:

  • প্রতিটি ফলাফলের জন্য একটি কলাম রয়েছে।
  • প্রতিটি কলামটি মূল ফলাফলগুলির একটির সাথে যুক্ত, প্রায় দুটি অংশে বিভক্ত।
  • প্রতিটি ফলাফলের আপেক্ষিক ক্ষেত্র / ওজন সংরক্ষণ করা হয়।

উপকরণ পদ্ধতির উদাহরণ একটি বিতরণকে একটি অনুসন্ধান সারণীতে রূপান্তর করে

( নমুনা পদ্ধতিতে এই নিবন্ধটি চিত্রের উপর ভিত্তি করে চিত্র )

কোডে, আমরা প্রতিটি কলাম থেকে বিকল্প ফলাফল বেছে নেওয়ার সম্ভাবনা এবং সেই বিকল্প ফলাফলের পরিচয় (বা "উপনাম") উপস্থাপন করে দুটি টেবিল (বা দুটি বৈশিষ্ট্যযুক্ত বস্তুর একটি টেবিল) সহ এটি উপস্থাপন করি। তারপরে আমরা বিতরণ থেকে যেমন নমুনা করতে পারি:

int SampleFromTables(float[] probabiltyTable, int[] aliasTable)
{
    int column = Random.Range(0, probabilityTable.Length);
    float p = Random.Range(0f, 1f);
    if(p < probabilityTable[column])
    {
        return column;
    }
    else
    {
        return aliasTable[column];
    }
}

এতে কিছুটা সেটআপ জড়িত:

  1. প্রতিটি সম্ভাব্য ফলাফলের আপেক্ষিক সম্ভাবনাগুলি গণনা করুন (সুতরাং আপনি যদি 1000d6 ঘূর্ণায়মান হন তবে প্রতি 1000 থেকে 6000 পর্যন্ত পাওয়ার পরিমাণগুলি আমাদের গণনা করতে হবে)

  2. প্রতিটি ফলাফলের জন্য একটি এন্ট্রি সহ এক জোড়া টেবিল তৈরি করুন। সম্পূর্ণ পদ্ধতিটি এই উত্তরের ক্ষেত্র ছাড়িয়ে গেছে, তাই আমি উচ্চারণ পদ্ধতি অ্যালগরিদমের এই ব্যাখ্যাটি উল্লেখ করার পরামর্শ দিচ্ছি

  3. এই টেবিলগুলি সংরক্ষণ করুন এবং প্রতিবার আপনার এই বিতরণ থেকে একটি নতুন এলোমেলো ডাই রোলের প্রয়োজন হলে তাদের আবার উল্লেখ করুন।

এটি একটি স্পেস-টাইম ট্রেড অফ । পূর্ববর্তী পদক্ষেপটি কিছুটা পরিস্ফুট এবং আমাদের যে ফলাফলের সংখ্যা রয়েছে তার সমানুপাতিক মেমরি আলাদা করে রাখতে হবে (যদিও 1000 ডি 6 এর জন্য আমরা একক-অঙ্কের কিলোবাইট ব্যবহার করছি, তাই ঘুম হারানোর কিছুই নেই), তবে আমাদের নমুনার বিনিময়ে আমাদের বিতরণ যত জটিল হতে পারে তা স্থির সময়-


আমি আশা করি methods পদ্ধতিগুলির মধ্যে একটি বা অন্য কিছু কার্যকর হতে পারে (বা আমি আপনাকে বোঝাতে পেরেছি যে নিষ্পাপ পদ্ধতির সরলতাটি লুপ করতে সময় লাগবে);)


1
দুর্দান্ত উত্তর। যদিও আমি নির্বিকার পন্থা পছন্দ করি। ত্রুটিগুলির জন্য খুব কম জায়গা এবং সহজে বোঝা যায়।
বামমজ্যাক

এফওয়াইআই এই প্রশ্নটি রেডডিতে একটি এলোমেলো প্রশ্ন থেকে একটি অনুলিপি-পেস্ট।
ভায়ল্যানকোর্ট

কমপ্লিটনেসের জন্য , আমি মনে করি এটি সেই লাল সূচিত থ্রেড যা @ অ্যালেক্সানড্রেভেল্যানকোর্টের কথা বলছে। উত্তরগুলি মূলত লুপিং সংস্করণটি রাখার (তার সময়ের ব্যয়টি যুক্তিসঙ্গত হতে পারে এমন কিছু প্রমাণ সহ) বা সাধারণ / গাউসীয় বিতরণ ব্যবহার করে বিপুল সংখ্যক ডাইস প্রায় অনুমান করার পরামর্শ দেয়।
ডিএমগ্রিগরি

উপনাম পদ্ধতির জন্য +1, দেখে মনে হচ্ছে খুব কম লোকই এটি সম্পর্কে জানে এবং এটি সত্যিই এই ধরণের সম্ভাব্যতা পছন্দসই পরিস্থিতিতে প্রচুর আদর্শ সমাধান এবং গাউসীয় সমাধানটির উল্লেখ করার জন্য +1, যা সম্ভবত "আরও ভাল" উত্তর যদি আমরা কেবল পারফরম্যান্স এবং স্পেস সাশ্রয় নিয়ে যত্নশীল।
WHN

0

দুর্ভাগ্যক্রমে উত্তরটি হ'ল এই পদ্ধতির ফলে কর্মক্ষমতা বাড়বে না।

আমি বিশ্বাস করি যে এলোমেলো নম্বর কীভাবে উত্পন্ন হয় সে প্রশ্নে কিছু ভুল ধারণা থাকতে পারে। [জাভা] এর নীচের উদাহরণটি ধরুন:

Random r = new Random();
int n = 20;
int min = 1; //arbitrary
int max = 6; //arbitrary
for(int i = 0; i < n; i++){
    int randomNumber = (r.nextInt(max - min + 1) + min)); //silly maths
    System.out.println("Here's a random number: " + randomNumber);
}

এই কোডটি 1 থেকে 6 (অন্তর্ভুক্ত) এর মধ্যে এলোমেলো সংখ্যা মুদ্রণের জন্য 20 বার লুপ করবে। যখন আমরা এই কোডটির কর্মক্ষমতা সম্পর্কে কথা বলি, র্যান্ডম অবজেক্টটি তৈরি করতে কিছুটা সময় নেওয়া হয় (এটি তৈরি হওয়ার সময় কম্পিউটারের অভ্যন্তরীণ ঘড়ির উপর ভিত্তি করে সিউডো-র্যান্ডম পূর্ণসংখ্যার একটি অ্যারে তৈরি করে) এবং তারপরে 20 ধ্রুব সময় প্রতিটি পরবর্তী আইটেম () কল দেখুন। যেহেতু প্রতিটি 'রোল' একটি ধ্রুবক সময় ক্রিয়াকলাপ, তাই এটি রোলিংটিকে খুব সস্তা সময় অনুসারে তৈরি করে। এছাড়াও লক্ষ্য করুন যে ন্যূনতম থেকে সর্বোচ্চের সীমা বেঁধে দেয় না (অন্য কথায়, একটি কম্পিউটারে ডি -600 রোল করার জন্য এটি একটি ডি 6 রোল করা ঠিক তত সহজ)। সময়ের জটিলতার নিরিখে কথা বলার ক্ষেত্রে, সমাধানটির পারফরম্যান্সটি কেবল ও (এন) যেখানে এন পাশের সংখ্যা।

বিকল্পভাবে, আমরা একক d100 (বা সেই বিষয়ে d10000) রোল দিয়ে যে কোনও সংখ্যক ডি 6 রোল আনতে পারি। এই পদ্ধতিটি ব্যবহার করে, আমাদের রোল দেওয়ার আগে প্রথমে আমাদের [পাশার মুখের সংখ্যা] * এন [পাশার সংখ্যা] শতাংশ গণনা করতে হবে (প্রযুক্তিগতভাবে এটি s * n - n + 1 শতাংশ, এবং আমাদের মোটামুটি ভাগ করতে সক্ষম হওয়া উচিত) অর্ধেকের পরে এটি প্রতিসাম্য; লক্ষ্য করুন যে 2d6 রোল সিমুলেট করার জন্য আপনার উদাহরণে, আপনি 11 শতাংশ এবং 6 টি স্বতন্ত্র গণনা করেছিলেন)। রোলিংয়ের পরে আমরা বাইনারি অনুসন্ধান ব্যবহার করতে পারি যে আমাদের রোলটি কোন রেঞ্জে পড়েছে তা নির্ধারণ করতে। সময়ের জটিলতার নিরিখে, এই দ্রবণটি কোনও ও (গুলি * এন) দ্রবণকে মূল্যায়ন করে, যেখানে s পার্শ্বের সংখ্যা এবং এন পাশ্বের সংখ্যা। আমরা দেখতে পাচ্ছি, এটি পূর্ববর্তী অনুচ্ছেদে প্রস্তাবিত ও (এন) সমাধানের চেয়ে ধীর।

সেখান থেকে এক্সট্রোপোলেটিং, বলুন আপনি 1000d20 রোল অনুকরণ করতে এই দুটি প্রোগ্রাম তৈরি করেছেন। প্রথমটি সহজভাবে 1000 বার ঘুরবে। দ্বিতীয় প্রোগ্রামটি প্রথমে 19,001 শতাংশ (1000 থেকে 20,000 এর সম্ভাব্য পরিসরের জন্য) নির্ধারণ করতে হবে অন্য কিছু করার আগে। সুতরাং আপনি যদি এমন কোনও অদ্ভুত সিস্টেমে না থাকেন যেখানে মেমরির চেহারাগুলি ভাসমান-পয়েন্ট অপারেশনগুলির চেয়ে বেশ কয়েকটি ব্যয়বহুল হয়, প্রতিটি রোলের জন্য পরের বার () ব্যবহার করে কলটি যাওয়ার পথটি মনে হয়।


2
উপরের বিশ্লেষণটি একদম সঠিক নয়। যদি আমরা এলিয়াস পদ্ধতি অনুসারে সম্ভাব্যতা এবং উপন্যাসের সারণী উত্পন্ন করতে কিছুটা সময় সামনে রেখে থাকি , তবে আমরা ধ্রুবক সময়টিতে একটি স্বেচ্ছাচারিত বিচ্ছিন্ন সম্ভাবনার বিতরণ থেকে নমুনা জানাতে পারি (২ টি এলোমেলো সংখ্যা এবং একটি সারণী অনুসন্ধান)। সুতরাং 5 ডাইসের রোল বা 500 ডাইসের রোল সিমুলেট করে টেবিলগুলি প্রস্তুত হয়ে গেলে, একই পরিমাণ কাজ লাগে। এটি প্রতিটি নমুনার জন্য বৃহত সংখ্যক ডাইসের উপরে লুপিংয়ের চেয়ে তাত্পর্যপূর্ণভাবে দ্রুত, যদিও এটি অবশ্যই এটি সমস্যার আরও ভাল সমাধান হিসাবে তৈরি করে না। ;)
ডিএমগ্রিগরি

0

আপনি যদি পাশের সংমিশ্রণগুলি সঞ্চয় করতে চান, তবে সুসংবাদটি হ'ল একটি সমাধান রয়েছে, খারাপটি হ'ল আমাদের কম্পিউটারগুলি এই ধরণের সমস্যার ক্ষেত্রে কোনওভাবে সীমাবদ্ধ।

ভাল খবর:

এই সমস্যাটির প্রতিরোধমূলক দৃষ্টিভঙ্গি রয়েছে:

1 / আপনার গ্রুপের পাশের সমস্ত সংমিশ্রণ গণনা করুন

2 / প্রতিটি সংমিশ্রণের সম্ভাবনা নির্ধারণ করুন

3 / পাশা ফেলে দেওয়ার পরিবর্তে এই তালিকায় অনুসন্ধান করুন

খারাপ খবর:

পুনরাবৃত্তির সাথে সংমিশ্রণের সংখ্যা নিম্নলিখিত সূত্রগুলি দিয়ে দেওয়া হয়েছে

Γএন=(এন+ +-1)=(এন+ +-1)!! (এন-1)!

( ফরাসি উইকিপিডিয়া থেকে ):

পুনরাবৃত্তি সঙ্গে সংমিশ্রণ

এর অর্থ হ'ল, উদাহরণস্বরূপ, 150 টি ডাইস সহ, আপনার কাছে 698'526'906 সংমিশ্রণ রয়েছে। আসুন ধরে নিই যে আপনি সম্ভাবনাটি 32 বিট ফ্লোট হিসাবে সংরক্ষণ করেন, আপনার 2,6 গিগাবাইট মেমরির প্রয়োজন হবে, এবং আপনাকে সূচির জন্য এখনও মেমরির প্রয়োজনীয়তা যুক্ত করতে হবে ...

কম্পিউটিং শর্তে, সংমিশ্রণ সংখ্যাটি কনভলিউশনগুলির দ্বারা গণনা করা যেতে পারে, যা সহজ তবে স্মৃতি সীমাবদ্ধতাগুলি সমাধান করে না।

উপসংহারে, একটি বৃহত সংখ্যক ডাইসের জন্য, আমি প্রতিটি সংমিশ্রণের সাথে সম্পর্কিত সম্ভাব্যতাগুলির পূর্বেই ডাইসগুলি নিক্ষেপ করার এবং ফলাফলটি পর্যবেক্ষণ করার পরামর্শ দেব।

সম্পাদন করা

তবে, আপনি কেবল ডাইসের যোগফলের প্রতি আগ্রহী হওয়ায় আপনি সম্ভাবনাগুলি খুব কম সংস্থান দিয়ে সঞ্চয় করতে পারেন।

কনভলিউশন ব্যবহার করে প্রতিটি ডাইসের যোগফলের জন্য আপনি সুনির্দিষ্ট সম্ভাবনাগুলি গণনা করতে পারেন।

সাধারণ সূত্রটি হ'ল এফআমি(মি)=Σএনএফ1(এন)এফআমি-1(মি-এন)

তারপরে 1/6 থেকে প্রতিটি ফলাফল 1 ডাইস দিয়ে ফর্ম করে আপনি যে কোনও সংখ্যক ডাইসের জন্য সমস্ত সঠিক সম্ভাবনা তৈরি করতে পারেন।

আমি উদাহরণের জন্য লিখেছি একটি রুক্ষ জাভা কোড এখানে রয়েছে (সত্যিই অনুকূল নয়):

public class DiceProba {

private float[][] probas;
private int currentCalc;

public int getCurrentCalc() {
    return currentCalc;
}

public float[][] getProbas() {
    return probas;
}

public void calcProb(int faces, int diceNr) {

    if (diceNr < 0) {
        currentCalc = 0;
        return;
    }

    // Initialize
    float baseProba = 1.0f / ((float) faces);
    probas = new float[diceNr][];
    probas[0] = new float[faces + 1];
    probas[0][0] = 0.0f;
    for (int i = 1; i <= faces; ++i)
        probas[0][i] = baseProba;

    for (int i = 1; i < diceNr; ++i) {

        int maxValue = (i + 1) * faces + 1;
        probas[i] = new float[maxValue];

        for (int j = 0; j < maxValue; ++j) {

            probas[i][j] = 0;
            for (int k = 0; k <= j; ++k) {
                probas[i][j] += probability(faces, k, 0) * probability(faces, j - k, i - 1);
            }

        }

    }

    currentCalc = diceNr;

}

private float probability(int faces, int number, int diceNr) {

    if (number < 0 || number > ((diceNr + 1) * faces))
        return 0.0f;

    return probas[diceNr][number];

}

}

আপনার পছন্দের প্যারামিটারগুলির সাথে ক্যালকপ্রব () কল করুন এবং তারপরে ফলাফলগুলির জন্য প্রোবা টেবিলটি অ্যাক্সেস করুন (প্রথম সূচক: 0 1 ডাইসের জন্য 0, দুটি দুটি ডাইসের জন্য 1)।

আমি আমার ল্যাপটপে এটি 1'000D6 দিয়ে পরীক্ষা করে দেখেছি, 1 থেকে 1'000 ডাইস এবং সমস্ত সম্ভাব্য পরিমাণের ডাইস থেকে সমস্ত সম্ভাবনাগুলি গণনা করতে 10 সেকেন্ড সময় লেগেছে।

পূর্বনির্মাণ এবং দক্ষ স্টোরেজ সহ, আপনার কাছে উচ্চ সংখ্যক ডাইসের জন্য দ্রুত উত্তর থাকতে পারে।

আশা করি এটা সাহায্য করবে.


3
যেহেতু ওপি কেবল পাশ্বের যোগফলের মান সন্ধান করছে , এই সংযুক্তি গণিত প্রযোজ্য নয়, এবং সম্ভাবনার সারণী এন্ট্রিগুলির সংখ্যা পাশের আকার এবং ডাইসের সংখ্যার সাথে লম্বাভাবে বৃদ্ধি পায়।
ডিএমগ্রিগরি

তুমি ঠিক ! আমি আমার উত্তর সম্পাদনা করেছি। আমরা যখন সর্বদা চালাক থাকি;)
elenfoiro78

আমি মনে করি আপনি একটি বিভাজন এবং বিজয় পদ্ধতির ব্যবহার করে দক্ষতা কিছুটা উন্নতি করতে পারবেন। আমরা 20d6 এর জন্য সম্ভাব্য সারণীটি নিজের সাথে 10d6 এর জন্য টেবিলটি সংহত করে গণনা করতে পারি। 10d6 আমরা 5d6 টেবিলটি নিজের সাথে সংহত করে খুঁজে পেতে পারি। 5d6 আমরা 2 ডি 6 এবং 3 ডি 6 টেবিলগুলি মিশ্রিত করে খুঁজে পেতে পারি। এইভাবে অর্ধেক দিয়ে এগিয়ে চলুন আমাদের 1-20 থেকে সারণী আকারের বেশিরভাগ তৈরি করতে এড়াতে এবং আকর্ষণীয় বিষয়গুলিতে আমাদের প্রচেষ্টা ফোকাস করতে দেয়।
ডিএমগ্রিগরি

1
এবং প্রতিসম ব্যবহার!
elenfoiro78
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.