পূর্ববর্তী ইভেন্টগুলির দ্বারা পক্ষপাতযুক্ত আমি কীভাবে একটি "এলোমেলো" জেনারেটর তৈরি করতে পারি?


37

আমি একটি সুযোগ ভিত্তিক ব্যবস্থা বাস্তবায়নের সন্ধান করছি যা পূর্বের ঘটনা দ্বারা পক্ষপাতদুষ্ট।

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

এই ধরণের সিস্টেমটি আমাকে সেই সময়ে খুব আগ্রহী করেছিল, এবং এখন আমি এই জাতীয় সমাধানের প্রয়োজনের মধ্যে আছি।

আমার সমস্যাগুলি এখানে:

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

আমার বর্তমান পদ্ধতিটি একটি র‌্যাফেল টিকিট ব্যবস্থার অনুরূপ। যখন কোনও ইভেন্ট হয় আমি অন্য সমস্ত ইভেন্টের পক্ষে ওজন পরিবর্তন করি। এই চারটি ইভেন্টটি সমান সম্ভাবনা হিসাবে বোঝানো হলে এটি কাজ করতে পারে, তবে আমার ক্ষেত্রে, আরও অনেক বেশি প্রচলিত হওয়া দরকার। তবে যেহেতু প্রচলিত ইভেন্টটি প্রায়শই ঘটে থাকে, এটি অন্যের ওজনকে লক্ষ্যমাত্রার চেয়ে অনেক বেশি স্থানান্তরিত করে এবং ইভেন্টটির প্রাথমিক মানগুলির গড় টিকিটের গণনা রাখার জন্য যে ওজন শিফটের প্রয়োজনীয়তা রয়েছে তা আমি খুঁজে পেতে পারি না event দেওয়া।

কয়েকটি দিক নির্দেশক বা একটি পরিষ্কার কাটা উদাহরণ অনেক প্রশংসা হবে।


4
আপনি যদি একটি অতি সংক্ষিপ্ত বা পরিশীলিত উত্তর চান তবে গণিত.এসইতে আপনার আরও ভাগ্যের জিজ্ঞাসা হতে পারে। সেখানকার গণিতবিদরা সম্ভাবনা নিয়ে জটিল প্রশ্নের উত্তর দিতে স্বাচ্ছন্দ্যবোধ করছেন। math.stackexchange.com
কেভিন -


6
গণিত সাইটের একটি বিকল্প যেখানে আপনি উত্তরগুলি বোঝার সম্ভাবনা বেশি তা হ'ল প্রোগ্রামার্স.এসই । অ্যালগরিদম নকশাটি ম্যাথের বিষয়ে বিশেষভাবে বিষয় নয় এবং দরকারী ইনপুট পেতে আপনার সম্ভবত প্রাথমিক নকশা নিয়ে আসতে হবে।
লিলিয়েনথাল

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

1
যেহেতু আমি এখানে কয়েকটি উত্তরের উপর সংখ্যাটি চালাচ্ছি, আমি খুঁজে পেয়েছি যে বিভিন্ন ধরণের প্রতিবন্ধকতা রয়েছে এবং যে সমাধানগুলি সেগুলির সমস্ত সমাধান করে তা আপনার প্রয়োজনের চেয়ে আরও জটিল হতে পারে। আপনার ব্যবহারের ক্ষেত্রে আরও কিছু নির্দিষ্টকরণ সেরা বিকল্পগুলিতে সংকুচিত হতে সহায়তা করতে পারে। উদাহরণস্বরূপ, আপনার ইভেন্টগুলির সম্ভাবনাগুলি কি মোটামুটি একই রকম (উদাহরণস্বরূপ, 20% সুযোগের সাথে 5 টির পৃথক ফলাফল), বা খুব আলাদা (যেমন 10% মিস 80% হিট 10% গুরুতর)? আপনি কি রান (যেমন একটি সারিতে 3 মিস) বা ক্লাম্পস / ওয়েটগুলি হ্রাস করতে চান (উদাহরণস্বরূপ 8 টি চেষ্টার মধ্যে 3 টি মিস করেছেন, বা আমার কাছে সমালোচনার আগে 20 টি প্রচেষ্টা)?
ডিএমগ্রিগরি

উত্তর:


19

মূলত, আপনি যা চাইছেন তা হ'ল "আধা-র্যান্ডম" ইভেন্ট জেনারেটর যা নিম্নলিখিত বৈশিষ্ট্যগুলি সহ ইভেন্টগুলি উত্পন্ন করে:

  1. প্রতিটি ইভেন্ট যে গড় হারে ঘটে তা আগেই নির্দিষ্ট করে দেওয়া হয়।

  2. একই ঘটনাটি এলোমেলোভাবে হওয়ার চেয়ে একটানা দু'বার ঘটার সম্ভাবনা কম।

  3. ঘটনাগুলি সম্পূর্ণ অনুমানযোগ্য নয়।

এটি করার একটি উপায় হ'ল প্রথমে একটি নন-এলোমেলো ইভেন্ট জেনারেটর প্রয়োগ করা যা লক্ষ্য 1 এবং 2 টি পূরণ করে এবং তারপরে 3 লক্ষ্যটি পূরণ করার জন্য কিছু এলোমেলোতা যুক্ত করে।


নন-এলোমেলো ইভেন্ট জেনারেটরের জন্য, আমরা একটি সাধারণ দমিয়ে থাকা অ্যালগরিদম ব্যবহার করতে পারি । বিশেষত, পি 1 , পি 2 , ..., পি এন 1 থেকে n এর ইভেন্টগুলির আপেক্ষিক সম্ভাবনা হয়ে উঠুক এবং এস = পি 1 + পি 2 + ... + পি এনকে ওজনের যোগফল হিসাবে দেখা যাক। তারপরে আমরা নিম্নলিখিত অ্যালগরিদমটি ব্যবহার করে একটি অ-র্যান্ডম সর্বাধিক সংখ্যক সামঞ্জস্যপূর্ণ ক্রম উত্পন্ন করতে পারি:

  1. প্রাথমিকভাবে, 1 = 2 = ... = এন = 0 দিন।

  2. একটি ইভেন্ট উৎপন্ন করার জন্য প্রতিটি বাড়ায় আমি দ্বারা পি আমি , এবং আউটপুট ঘটনা যার জন্য বৃহত্তম (বন্ধন আপনি যেভাবে চান সেভাবে ভঙ্গ) হয়।

  3. হ্রাস দ্বারা গুলি , এবং ধাপে 2 থেকে পুনরাবৃত্তি।

উদাহরণস্বরূপ, পি = 5, পি বি = 4 এবং পি সি = 1 সহ তিনটি ইভেন্ট এ, বি এবং সি দেওয়া , এই অ্যালগরিদম আউটপুটগুলির নিম্নলিখিত ক্রমের মতো কিছু উত্পন্ন করে:

A B A B C A B A B A A B A B C A B A B A A B A B C A B A B A

লক্ষ্য করুন যে কীভাবে 30 ইভেন্টের ক্রমটি ঠিক 15 হিসাবে, 12 বিএস এবং 3 সিএস রয়েছে contains এটি একেবারে অনুকূলভাবে বিতরণ করা হয় না - পরপর দুটি হিসাবে দু'জনের কয়েকটি ঘটনা রয়েছে যা এড়ানো যেত - তবে এটি কাছাকাছি আসে।


এখন, এই ক্রমটিতে এলোমেলোতা যুক্ত করার জন্য আপনার কাছে বেশ কয়েকটি (অগত্যা পারস্পরিক একচেটিয়া নয়) বিকল্প রয়েছে:

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

    এটি এন = 3 দিয়ে উপরের উদাহরণটিতে প্রয়োগ করে উদাহরণস্বরূপ:

    A B A B C A B B A B A B C A A A A B B A B A C A B A B A B A

    অন্যদিকে এন = 10 আরও এলোমেলো চেহারা দেয়:

    A A B A C A A B B B A A A A A A C B A B A A B A C A C B B B

    খেয়াল করুন যে কীভাবে সাধারণ ঘটনাগুলি এ এবং বি এলোমেলো হয়ে যাওয়ার কারণে আরও অনেক বেশি রান নিয়ে আসে, যখন বিরল সি ইভেন্টগুলি এখনও বেশ ভালভাবেই ফাঁক করে যায়।

  • আপনি কিছুটা এলোমেলোভাবে সরাসরি সংমিশ্রণ অ্যালগরিদমে ইনজেকশন করতে পারেন। উদাহরণ হিসেবে বলা যায়, এর পরিবর্তে বৃদ্ধিশীল এর আমি দ্বারা পি আমি ধাপ 2, আপনি এটি দ্বারা বাড়ায় পারে পি আমি × র্যান্ডম (0, 2), যেখানে র্যান্ডম ( একটি , ) একটি অবিশেষে মধ্যে র্যান্ডম সংখ্যা বিতরণ করা হয় একটি এবং ; এটি নিম্নলিখিতগুলির মতো আউটপুট দেয়:

    A B B C A B A A B A A B A B A A B A A A B C A B A B A C A B

    অথবা আপনি পারা বৃদ্ধি আমি দ্বারা পি আমি + + র্যান্ডম (- , ), যা (জন্য উত্পাদন করবে = 0.1 × গুলি ):

    B A A B C A B A B A B A B A C A B A B A B A A B C A B A B A

    বা, সি = 0.5 × এর জন্য :

    B A B A B A C A B A B A A C B C A A B C B A B B A B A B C A

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

  • অন্যথা, আপনি বিমূঢ় পারে আউটপুট কখনো কখনো মনোনীত ঘটনা প্রতিস্থাপন ডিথারিং আলগোরিদিম একটি র্যান্ডম এক (কাঁচা ওজন অনুযায়ী মনোনীত সঙ্গে পি আমি )। যতক্ষণ আপনি দ্বিতীয় ধাপে আউটপুট নেওয়ার সাথে সাথে পদক্ষেপ 3 তে একই কে ব্যবহার করেন ততক্ষণে দুরন্ত প্রক্রিয়াটি এমনকি এলোমেলো ওঠা-নামাও করতে পারে।

    উদাহরণস্বরূপ, প্রতিটি ইভেন্টের 10% সুযোগ এলোমেলোভাবে নির্বাচিত হওয়ার সাথে এখানে কয়েকটি উদাহরণ আউটপুট দেওয়া হয়েছে:

    B A C A B A B A C B A A B B A B A B A B C B A B A B C A B A

    এবং প্রতিটি আউটপুট এলোমেলো হওয়ার 50% সুযোগ সহ এখানে একটি উদাহরণ রয়েছে:

    C B A B A C A B B B A A B A A A A A B B A C C A B B A B B C

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

গীত। তুলনা করার জন্য এখানে একই গড় হারের সাথে কয়েকটি সম্পূর্ণ র্যান্ডম ইভেন্ট সিকোয়েন্স রয়েছে:

A C A A C A B B A A A A B B C B A B B A B A B A A A A A A A
B C B A B C B A A B C A B A B C B A B A A A A B B B B B B B
C A A B A A B B C B B B A B A B A A B A A B A B A C A A B A

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

চক্রান্ত
আধা-এলোমেলো মুদ্রা উত্পন্ন করার জন্য বেশ কয়েকটি কৌশলের প্লট ফ্লিপ হয় (গড়তে লেজ 50-50 এর মাথার অনুপাত সহ)। অনুভূমিক অক্ষগুলি হ'ল ফ্লিপের সংখ্যা, উল্লম্ব অক্ষটি প্রত্যাশিত অনুপাত থেকে সংক্ষিপ্ত দূরত্ব, (মাথা - লেজ) / 2 = মাথা - ফ্লিপ / 2 হিসাবে পরিমাপ করা হয়।

প্লটের লাল এবং সবুজ রেখাগুলি তুলনার জন্য দুটি নন-ডেক-ভিত্তিক অ্যালগরিদম দেখায়:

  • লাল রেখা, নির্জনবাদী দমন : সম -সংখ্যাযুক্ত ফলাফলগুলি সর্বদা প্রধান, বিজোড়-সংখ্যাযুক্ত ফলাফল সর্বদা লেজ থাকে।
  • সবুজ রেখা, স্বতন্ত্র এলোমেলো ফ্লিপ : প্রতিটি ফলাফল 50% মাথা এবং 50% লেজ হওয়ার সম্ভাবনা সহ এলোমেলোভাবে স্বাধীনভাবে নির্বাচিত হয়।

অন্য তিনটি লাইন (নীল, বেগুনি এবং সায়ান) তিনটি ডেক-ভিত্তিক কৌশলগুলির ফলাফল দেখায়, প্রতিটি 40 টি কার্ডের একটি ডেক ব্যবহার করে প্রয়োগ করা হয়, যা প্রাথমিকভাবে 20 "হেড" কার্ড এবং 20 "লেজ" কার্ড দ্বারা পূর্ণ হয়:

  • নীল রেখা, খালি হলে পূরণ করুন : ডেক খালি না হওয়া পর্যন্ত কার্ডগুলি এলোমেলোভাবে আঁকা হয়, তারপরে ডেকটি 20 "হেড" কার্ড এবং 20 "লেজ" কার্ড দিয়ে পুনরায় পূরণ করা হবে।
  • বেগুনি রেখা, অর্ধেক শূন্য হলে পূরণ করুন : ডেকের 20 টি কার্ড না ফেলে অবধি কার্ডগুলি এলোমেলোভাবে আঁকানো হবে; তারপরে ডেকটি 10 ​​"হেড" কার্ড এবং 10 "লেজ" কার্ড সহ শীর্ষে রয়েছে।
  • সায়ান লাইন, ক্রমাগত পূরণ করুন : কার্ড এলোমেলোভাবে আঁকা হয়; সম-সংখ্যাযুক্ত অঙ্কনগুলি তত্ক্ষণাত্ একটি "মাথা" কার্ডের সাথে প্রতিস্থাপন করা হবে, এবং একটি "লেজ" কার্ডের সাথে বিজোড়-সংখ্যাযুক্ত অঙ্কন হবে।

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

(প্রকৃতপক্ষে, শূন্য থেকে দূরে নীল, বেগুনি এবং সায়ান লাইনগুলির বিচ্যুতি ডেক আকারের সাথে কঠোরভাবে আবদ্ধ হয়: নীল লাইনটি শূন্য থেকে 10 ধাপের বেশি দূরে কখনই প্রবাহিত হতে পারে না, বেগুনি লাইনটি শূন্য থেকে কেবল 15 ধাপ দূরে পেতে পারে , এবং সায়ান লাইনটি শূন্য থেকে প্রায় 20 ধাপ দূরে সরে যেতে পারে practice অবশ্যই বাস্তবে, কোনও লাইন প্রকৃতপক্ষে তার সীমাতে পৌঁছানোর সম্ভাবনা খুব কমই রয়েছে, কারণ তারা খুব দূরে ঘুরে বেড়ালে তাদের শূন্যের কাছাকাছি ফিরে যাওয়ার প্রবল প্রবণতা রয়েছে there's বন্ধ।)

এক নজরে, বিভিন্ন ডেক-ভিত্তিক কৌশলগুলির মধ্যে কোনও স্পষ্ট পার্থক্য নেই (যদিও গড় হিসাবে নীল রেখাটি লাল রেখার কিছুটা কাছাকাছি থাকে এবং সায়ান লাইনটি কিছুটা দূরে থাকে), তবে নীল লাইনের একটি আরও ঘনিষ্ঠ পরিদর্শন একটি স্বতন্ত্র নির্নায়ক প্যাটার্ন প্রকাশ করে: প্রতি 40 টি অঙ্কন (বিন্দু ধূসর উল্লম্ব লাইন দ্বারা চিহ্নিত), নীল রেখাটি শূন্যের সাথে লাল রেখার সাথে মিলিত হয়। বেগুনি এবং সায়ান লাইনগুলি এত কঠোরভাবে সীমাবদ্ধ নয় এবং যে কোনও সময়ে শূন্য থেকে দূরে থাকতে পারে।

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


খুব বিস্তৃত উত্তর। দুরন্ত অ্যালগরিদমে এলোমেলো উপাদান যুক্ত করা সরাসরি মনে হয়। :)
সোনাতেন

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

53

পাশা, ডিল কার্ড রোল করবেন না।

আপনার আরএনজির সমস্ত সম্ভাব্য ফলাফল নিন, এগুলিকে একটি তালিকায় রাখুন, এলোমেলোভাবে এলোমেলো করুন এবং এলোমেলো ক্রমে ফলাফলগুলি ফিরিয়ে দিন। আপনি যখন তালিকার শেষে আছেন, পুনরাবৃত্তি করুন।

ফলাফলগুলি এখনও অভিন্নভাবে বিতরণ করা হবে, তবে তালিকার শেষটি যদি পরেরটির প্রথমটি না ঘটে তবে স্বতন্ত্র ফলাফলগুলি পুনরাবৃত্তি করবে না।

এটি যখন আপনার স্বাদের জন্য কিছুটা অনুমানযোগ্য তখন আপনি এমন একটি তালিকা ব্যবহার করতে পারবেন যা nসম্ভাব্য ফলাফলের সংখ্যার nচেয়ে দ্বিগুণ এবং প্রতিটি সম্ভাব্য ফলাফলকে এলোমেলো করার আগে বার করে দিতে পারে । অথবা আপনি তালিকাটি সম্পূর্ণরূপে পুনরুক্ত হওয়ার আগেই তা পরিবর্তন করতে পারেন।


1
"এলোমেলো ব্যাগ" দেখুন (এমনকি এই সাইটে)
25-15

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

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

4
ইলমারি করোনেন: আপনি যখন আইটেমগুলি প্রতিস্থাপন করেন, আপনি অভিন্ন ফলাফলের নির্দিষ্ট রান বা নির্দিষ্ট ফলাফলের মধ্যে দীর্ঘ ব্যবধানকে সীমাবদ্ধ রাখার ক্ষেত্রে শফল ব্যাগের সুবিধা হারাতে পারেন। যদি আপনার প্রতিস্থাপনের হার লক্ষ্য সম্ভাবনা বিতরণের সমান হয়, আপনি এখন এলোমেলোভাবে স্বাধীনভাবে প্রতিটি ফলাফল উত্পন্ন করার মতো একই অবস্থানে রয়েছেন। যদি এটি টার্গেট সম্ভাব্যতা বিতরণের সমান না হয়, তবে আপনি সেই সম্ভাবনাগুলি এমনভাবে কার্যকর করতে পারেন যেগুলি অনুমান করা এবং তদনুসারে ভারসাম্য বজায় রাখা কঠিন - প্রশ্নকারী ঠিক এই সমস্যাটির সাথে লড়াইয়ের বর্ণনা দিয়েছেন describes
ডিএমগ্রিগরি

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

17

আপনি একটি মার্কভ র্যান্ডম গ্রাফ চেষ্টা করতে পারেন । গ্রাফের নোড হতে পারে এমন প্রতিটি ইভেন্ট বিবেচনা করুন। প্রতিটি ইভেন্ট থেকে একে অপরের ইভেন্টে একটি লিঙ্ক তৈরি করুন যা সম্ভবত এটির পরে আসতে পারে। এই লিঙ্কগুলির প্রত্যেকটিই এমন কিছু দ্বারা ভারিত হয় যা রূপান্তর সম্ভাবনা বলে । তারপরে, আপনি ট্রানজিশন মডেল অনুযায়ী গ্রাফের এলোমেলো হাঁটা সঞ্চালন করেন।

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

স্থানান্তরগুলিকে কীভাবে ওজন করা যায় সে বিষয়ে সিদ্ধান্ত নেওয়ার প্রয়োজন। একটি জিনিসের জন্য, নোড থেকে বেরিয়ে আসা সমস্ত ট্রানজিশনগুলির 1 এর সম্ভাব্যতা যুক্ত করা দরকার যা আপনি করতে পারেন একটি সাধারণ কাজ হ'ল সেই ঘটনাগুলির সম্ভাবনার সমান ওজন সহ প্রতিটি নোড থেকে অন্য নোডে স্থানান্তর করা is একটি অগ্রাধিকার , প্রদত্ত যে বর্তমান ইভেন্টটি আর ঘটতে পারে না।

উদাহরণস্বরূপ, যদি আপনার তিনটি ইভেন্ট থাকে:

  Critical, P = 0.1
  Hit,      P = 0.3
  Miss,     P = 0.6

আপনি রূপান্তর মডেলটি এমনভাবে সেট আপ করতে পারেন যে তার সম্ভাব্যতার ভরটিকে অন্য ইভেন্টগুলিতে অভিন্নভাবে পুনরায় বিতরণ করে একটি সমালোচনা হিট হয় না আবার:

  Critical -> Critical,   P = 0.0
  Critical -> Hit,        P = 0.35
  Critical -> Miss,       P = 0.65

সম্পাদনা: নীচে মন্তব্যগুলি যেমন বলেছে, পছন্দসই আচরণ পেতে এই মডেলটি যথেষ্ট জটিল নয়। পরিবর্তে, আপনাকে একাধিক অতিরিক্ত রাজ্য যুক্ত করতে হতে পারে!


1
আপনার প্রস্তাবিত পুনঃনির্মাণ প্রকল্পটি প্রতিটি রাজ্যের পছন্দসই সম্ভাবনাগুলি সংরক্ষণ করে না। এই সংখ্যাগুলির সাথে একটি পরীক্ষামূলক পরীক্ষা করা, প্রায় ৪১% সময় মিস হয় এবং সমালোচকরা ইনপুট মানগুলি থেকে প্রায় 25%, মিস করে। অবশিষ্ট সম্ভাব্যতার সাথে আনুপাতিক সমাপ্ত রাজ্যে স্থানান্তরকরণ (যেমন মিসের ক্রিট যাওয়ার 25% সম্ভাবনা এবং হিটে যাওয়ার 75% সম্ভাবনা রয়েছে) 44% মিস রেট এবং 17% সমালোচক সহ কিছুটা ভাল করে তবে এটি এখনও রয়েছে ইনপুটটিতে কাঙ্ক্ষিত সম্ভাবনার প্রতিফলন নয়।
ডিএমগ্রিগরি

আমি বেয়েসের নিয়মটি ভুলে গেছি :( পরে আবার গণনা করব the পূর্বের সম্ভাবনা বন্টন বজায় রাখা সম্ভব হবে না কারণ রূপান্তর মডেলটি সিসিএইচএম বা সিএইচএইচএম বা সম্ভবত এমএমএইচএম ইত্যাদির মতো সম্ভাব্য সিকোয়েন্সগুলি ছেড়ে যায়
এমক্লিংঞ্জেন

"কোনও পুনরাবৃত্তি হবে না" বাধা আপনার হাত এখানে বেঁধে দিতে পারে, চরম উচ্চ এবং নিম্ন ওজনের ক্ষেত্রে। আপনি যদি 10 টির মধ্যে 1 টি সমালোচক হওয়ার চেষ্টা করেন তবে এই পদ্ধতিটি কেবলমাত্র 5 টি মিস এবং 5 হিট বিকল্পগুলির সাথে পূরণ করতে পারে যা হিট এবং মিসের সম্ভাবনাগুলিকে তাদের গড়ের দিকে বিকৃত করে। পর পর মিস করা ছাড়া কোনও অনুক্রম এখানে ইনপুটটির প্রয়োজনীয়তা পূরণ করতে পারে না।
ডিএমগ্রিগরি

4
@ এমক্লিংজেন, আমি ডিএমগ্রিগরির সাথে একমত, "কঠোরভাবে কোনও পুনরাবৃত্তি করা" এখানে কাম্য নয়। পরিবর্তে, তারা চান যে একই ফলাফলের দীর্ঘ শৃঙ্খলার সম্ভাবনাগুলি অভিন্ন এলোমেলো সম্ভাবনার চেয়ে কম সম্ভাবনা রয়েছে। আপনি একটি মার্কভ চেইন (যা নির্দেশ করা হয়) দেখে মনে হচ্ছে যে এই কাজ করতে পারে এই । এটি পুনরাবৃত্ত ইভেন্টগুলিকে প্রতিনিধিত্ব করতে একাধিক রাজ্য ব্যবহার করে যেখানে "হিট 1" থেকে "হিট 2" এবং "হিট 2" থেকে "হিট 3+" তে রূপান্তরিত হওয়ার সম্ভাবনাগুলি হ্রাস পায় এবং "হিট 1" এবং "ক্রিট-এ ফিরে যাওয়ার সম্ভাবনা রয়েছে 1 "উপরে যান।
1515

@ নতুন আয় এটি দুর্দান্ত ধারণা।
mklingen

3

আমি এখানে সি # তে একটি বাস্তবায়ন তৈরি করেছি যা হ'ল:

  • সম্ভাবনার উপর ভিত্তি করে ইভেন্টগুলি সক্রিয় করুন
  • পুনরাবৃত্ত ইভেন্টগুলির সম্ভাবনা হ্রাস করতে এই সম্ভাবনাগুলি সামঞ্জস্য করুন
  • মূল সম্ভাবনা থেকে খুব দূরে পথভ্রষ্ট নয়

আমি কয়েকটি মন্তব্য যুক্ত করেছি যাতে আপনি দেখতে পাচ্ছেন যে আমি কী করছি।

    int percentageEvent1 = 15; //These are the starter values. So given a scenario, the
    int percentageEvent2 = 40; //player would have around a 15 percent chance of event
    int percentageEvent3 = 10; //one occuring, a 40 percent chance of event two occuring
    int percentageEvent4 = 35; //10 percent for event three, and 35 percent for event four.

    private void ResetValues()
    {
        percentageEvent1 = 15;
        percentageEvent2 = 40;
        percentageEvent3 = 10;
        percentageEvent4 = 35;
    }

    int resetCount = 0; //Reset the probabilities every so often so that they don't stray too far.

    int variability = 1; //This influences how much the chance of an event will increase or decrease
                           //based off of past events.

    Random RandomNumberGenerator = new Random();

    private void Activate() //When this is called, an "Event" will be activated based off of current probability.
    {
        int[] percent = new int[100];
        for (int i = 0; i < 100; i++) //Generate an array of 100 items, and select a random event from it.
        {
            if (i < percentageEvent1)
            {
                percent[i] = 1; //Event 1
            }
            else if (i < percentageEvent1 + percentageEvent2)
            {
                percent[i] = 2; //Event 2
            }
            else if (i < percentageEvent1 + percentageEvent2 + percentageEvent3)
            {
                percent[i] = 3; //Event 3
            }
            else
            {
                percent[i] = 4; //Event 4
            }
        }
        int SelectEvent = percent[RandomNumberGenerator.Next(0, 100)]; //Select a random event based on current probability.

        if (SelectEvent == 1)
        {
            if (!(percentageEvent1 - (3 * variability) < 1)) //Make sure that no matter what, probability for a certain event
            {                                                //does not go below one percent.
                percentageEvent1 -= 3 * variability;
                percentageEvent2 += variability;
                percentageEvent3 += variability;
                percentageEvent4 += variability;
            }
        }
        else if (SelectEvent == 2)
        {
            if (!(percentageEvent2 - (3 * variability) < 1))
            {
                percentageEvent2 -= 3 * variability;
                percentageEvent1 += variability;
                percentageEvent3 += variability;
                percentageEvent4 += variability;
            }
        }
        else if (SelectEvent == 3)
        {
            if (!(percentageEvent3 - (3 * variability) < 1))
            {
                percentageEvent3 -= 3 * variability;
                percentageEvent1 += variability;
                percentageEvent2 += variability;
                percentageEvent4 += variability;
            }
        }
        else
        {
            if (!(percentageEvent4 - (3 * variability) < 1))
            {
                percentageEvent4 -= 3 * variability;
                percentageEvent1 += variability;
                percentageEvent2 += variability;
                percentageEvent3 += variability;
            }
        }

        resetCount++;
        if (resetCount == 10)
        {
            resetCount = 0;
            ResetValues();
        }

        RunEvent(SelectEvent); //Run the event that was selected.
    }

আশা করি এটি সহায়তা করে, দয়া করে মন্তব্যে এই কোডটির উন্নতি করার পরামর্শ দিন, ধন্যবাদ!


1
এই পুনঃনির্মাণ প্রকল্পটি সজ্জিত ইভেন্টগুলিকে সৃজনশীল হতে পারে। পর্যায়ক্রমে ওজন পুনরায় সেট করা সত্যিই কেবল একটি ব্যান্ড-সহায়তা যা এটি কতটা খারাপ হয়ে যায় তা সীমাবদ্ধ করে, যখন 10 টির মধ্যে 1 টি রোল ওজন থেকে কোনও লাভ পায় না তা নিশ্চিত করে। এছাড়াও, একটি অ্যালগোরিদম নোট: আপনি এলোমেলো নির্বাচন করতে 100 এন্ট্রি একটি টেবিল পূরণ করে আপনি প্রচুর কাজ নষ্ট করছেন। পরিবর্তে, আপনি এলোমেলো রোল জেনার করতে পারেন এবং তারপরে আপনার 4 টি ফলাফলের পুনরাবৃত্তি করতে পারেন, যেমন আপনি যাচ্ছেন ততই তাদের সম্ভাবনার সংস্থান করে। যত তাড়াতাড়ি রোলটি যোগফলের চেয়ে কম হবে, আপনার ফলাফল রয়েছে। কোনও টেবিল ভর্তি প্রয়োজন।
ডিএমগ্রিগরি

3

আমাকে এম্কলিনজেনের উত্তরটি কিছুটা সাধারণ করতে দিন। মূলত, আপনি জুবলারের মিথ্যা প্রয়োগ করতে চান , যদিও আমি এখানে আরও সাধারণ পদ্ধতি সরবরাহ করব:

বলুন nসম্ভাব্যতার সাথে সম্ভাব্য ইভেন্ট রয়েছে p_1, p_2, ..., p_n। যখন ঘটনাটি iঘটেছে, এর সম্ভাব্যতা একটি ফ্যাক্টর দিয়ে পুনরুদ্ধার করা হবে 0≤a_i≤1/p_i(দ্বিতীয়টি গুরুত্বপূর্ণ, অন্যথায় আপনি একের চেয়ে বেশি সম্ভাবনার সাথে শেষ করেন এবং অন্যান্য ইভেন্টগুলির অবশ্যই নেতিবাচক সম্ভাবনা থাকে , যার মূলত " বিরোধী "-উদ্ভুত বা কিছু বোঝানো হয়), যদিও সাধারণত a_i<1। উদাহরণস্বরূপ আপনি বেছে নিতে পারেন a_i=p_i, যার অর্থ দ্বিতীয়বারের মতো ঘটনার সম্ভাবনা হ'ল আসল সম্ভাবনা হ'ল ঘটনাটি একটানা দু'বার যথাযথভাবে ঘটতে পারে, যেমন একটি দ্বিতীয় কয়েন টসে 1/2 এর পরিবর্তে 1/4 এর সম্ভাবনা থাকে ability অন্যদিকে, আপনার কিছু a_i>1থাকতে পারে, যার অর্থ "ভাগ্য / দুর্ভাগ্যের স্ট্রোক" ট্রিগার করা।

অন্যান্য সমস্ত ঘটনা একে অপরের সাথে তুলনামূলকভাবে সমান সম্ভাব্য থাকবে, অর্থাত্ তাদের সমস্তকে একই ফ্যাক্টর দ্বারা পুনরুদ্ধার করতে হবে b_iযেমন সমস্ত সম্ভাবনার যোগফলের সমান, যেমন,

1 = a_i*p_i + b_i*(1-p_i)  # Σ_{j≠i) p_j  = 1 - p_i
 b_i = (1 - a_i*p_i) / (1 - p_i).   (1)

এতদূর, এত সহজ। তবে এখন আরও একটি প্রয়োজনীয়তা যুক্ত করা যাক: দুটি ইভেন্টের সমস্ত সম্ভাব্য ক্রম বিবেচনা করে, সেখান থেকে প্রাপ্ত একক ইভেন্টের সম্ভাবনাগুলি আসল সম্ভাবনাগুলি হবে।

দিন

        / p_i * b_i * p_j  (ji)
p_ij = <
        \ a_i * (p_i     (j=i)

ইভেন্টের jপরে ঘটনার সম্ভাব্যতা বোঝান iএবং নোট করুন ( p_ij≠p_jiযদি বোঝায় না ) এটি বয়েসের উপপাদ্যটিরও প্রয়োজন এবং এটিও বোঝায়b_i=b_j (2)(1)a_j = 1 - a_i*p_i + (1-a_i)*p_i/p_j

Σ_j p_ij = p_i * b_i * (1 - p_i) + a_i * (p_i
         = b_i * p_i + (a_i - b_i) * (p_i
         = p_i  # using (1)

ঠিক যেমন পছন্দসই কেবলমাত্র নোট করুন এর অর্থ কীভাবে একজন a_iঅন্য সবগুলি ঠিক করে দেয়।


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

ক) প্রথম ইভেন্টটি সম্পর্কে ভুলে যান এবং র‌্যাবের মতো মনে হয় কেবল দ্বিতীয়টি ঘটেছিল, যেমন

         / p_ij * a_j * p_j  (j=k)
p_ijk = <
         \ p_ij * b_j * p_l  (jk)

নোট করুন যে এটি সাধারণত বেয়েসকে লঙ্ঘন করে, যেমন p_jik≠p_ikjবেশিরভাগ ক্ষেত্রে।

খ) সম্ভাব্যতাগুলি p_ij(স্থির জন্য i) নতুন সম্ভাব্যতা হিসাবে ব্যবহার করুন pi_jযা থেকে আপনি পরবর্তী pi_jkঘটনার জন্য নতুন সম্ভাবনাগুলি পান k। আপনি সংশোধন করেন ai_jবা না তা আপনার উপর নির্ভর করে তবে সচেতন হন যে bi_jপরিবর্তিত হওয়ার কারণে নতুনটি অবশ্যই আলাদা pi_j। তারপরে আবার একই সম্ভাবনাটি দেখা ai_jদেওয়ার সমস্ত ক্রম প্রয়োজনীয়তার দ্বারা পছন্দগুলি সীমাবদ্ধ ijk। দেখা যাক...

         / p_ij * bi_j * pi_k  (jk)
p_ijk = <
         \ (p_ij * ai_j      (j=k)

         / b_i * bi_j * p_i * p_j * pi_k  (ijki)
         | b_i * ai_j * p_i * (p_j      (ij=k)
      = <  a_i * (p_i * bi_i * pi_k     (i=jk)
         | b_i * p_i * bi_j * p_k * pi_i  (i=kj)
         \ a_i * ai_i * (p_i * pi_i     (i=k=j)

এবং এর চক্রীয় ক্রমগুলি, যা সংশ্লিষ্ট ক্ষেত্রে সমান হতে হবে।

আমি আশঙ্কা করছি এই বিষয়ে আমার ধারাবাহিকতা আরও কিছুক্ষণ অপেক্ষা করতে হবে ...


এটি পরীক্ষামূলকভাবে পরীক্ষা করা, এরপরেও অনেকগুলি রানের চেয়ে ইনপুট সম্ভাবনা থেকে দূরে একটি বিকৃতি ঘটে। উদাহরণস্বরূপ যদি a_i / p_i = 0.5, এবং (এবং মিক্লিংজেনের উত্তর থেকে সংখ্যাগুলি ব্যবহার করে) 60% এর একটি ইনপুট মিস হার 50.1% এর একটি পর্যবেক্ষণ হার হয়ে যায়, এবং 10% এর একটি ইনপুট সমালোচনামূলক হার 13.8% হিসাবে পরিলক্ষিত হয়। ফলাফল রূপান্তর ম্যাট্রিক্সকে একটি উচ্চ শক্তিতে নিয়ে গিয়ে আপনি এটি যাচাই করতে পারেন। A_i এর অনুপাত নির্বাচন করা: পি_আই 1 এর কাছাকাছি ফলাফলের ফলে কম বিকৃতি ঘটায়, তবে রান হ্রাস করার ক্ষেত্রে কম কার্যকারিতাও রয়েছে।
ডিএমগ্রিগরি

@ ডিএমজি গ্রেগরি ভাল পয়েন্ট: আপনি কেবল রূপান্তর ম্যাট্রিক্সের ক্ষমতা নিতে পারবেন না। আমি তার পরে আমার উত্তরটি প্রসারিত করব
টোবিয়াস কেইনজলার

@ ডিএমজি গ্রেগরি আমি সম্পূর্ণ প্রক্রিয়াটি (রূপান্তর বি) বর্ণনা করতে শুরু করেছি, তবে এটি বেশ ক্লান্তিকর হয়ে
পড়েছে

1

আমি মনে করি সবচেয়ে ভাল বিকল্পটি এলোমেলো-ভারিত আইটেম নির্বাচন ব্যবহার করা। সেখানে সি # এর জন্য একটি বাস্তবায়ন এর এখানে , কিন্তু তারা সহজে খুঁজে পাওয়া যায় বা পাশাপাশি অন্যান্য ভাষার জন্য প্রণীত।

ধারণাটি হ'ল প্রতিবার যখন কোনও বিকল্পের বাছাই করা হয় তার ওজন হ্রাস করা এবং প্রতিবার এটি বাছাই না করা বাড়ানো।

উদাহরণস্বরূপ, যদি আপনি বাছাই করা বিকল্পটির ওজন হ্রাস করে NumOptions-1এবং অন্যান্য বিকল্পের ওজন 1 দিয়ে বাড়িয়ে থাকেন (ওজন <0 দিয়ে আইটেমগুলি সরাতে যত্নবান হন এবং তারা 0 এর উপরে ওঠেন তখন সেগুলি পড়ুন) , প্রতিটি বিকল্প প্রায় বাছাই করা হবে দীর্ঘ সময় ধরে একই সংখ্যক বার, তবে সম্প্রতি নির্বাচিত বিকল্পগুলি বেছে নেওয়ার সম্ভাবনা অনেক কম।


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


1

আমার উত্তরটি ভুল, আমার পরীক্ষাটি ত্রুটিযুক্ত ছিল।

আমি এই উত্তরটি এখানে আলোচনা এবং মন্তব্যের জন্য রেখে যাচ্ছি যা এই ডিজাইনের ত্রুটিগুলি চিহ্নিত করে, তবে আসল পরীক্ষাটি ভুল ছিল।

আপনি যা সন্ধান করছেন এটি একটি ওজনযুক্ত ওজন: আপনার চারটি সম্ভাব্য ফলাফলের জন্য ওজনকে পূর্ববর্তী ফলাফলগুলির দ্বারা আরও সামঞ্জস্য করা (ওজনযুক্ত) করা দরকার, যদিও সামগ্রিকভাবে যথাযথ ওজন বাকি রয়েছে।

এটি সম্পাদন করার সহজতম উপায় হ'ল নির্দিষ্ট মানটির ঘূর্ণায়মান ও অন্যান্য ওজন বাড়িয়ে প্রতিটি রোলের জন্য সমস্ত ওজনকে পরিবর্তন করা

উদাহরণ হিসাবে, ধরুন আপনার 4 টি ওজন রয়েছে: ফম্পল, মিস, হিট এবং সমালোচক। এগুলির জন্য আপনার পছন্দসই সামগ্রিক ওজন হ'ল ফম্পল = 10%, মিস = 50%, হিট = 30% এবং সমালোচক = 10%।

যদি আপনি 1 এবং 100 এর মধ্যে মান উত্পাদন করতে একটি এলোমেলো সংখ্যার জেনারেটর (আরএনজি) ব্যবহার করেন এবং তারপরে সেই মানটির সাথে এটি যেখানে এই সীমাতে আসে তার সাথে তুলনা করুন (1-10 ফাম্বল, 11-60 মিস, 61-90 হিট, 91-100 সমালোচক ), আপনি পৃথক রোল তৈরি করছেন।

যদি আপনি যে রোল বানাতে, আপনি তারপর অবিলম্বে ঐ রেঞ্জ ঘূর্ণিত, তাহলে ভবিষ্যতে রোলস তৌল করা হবে মান উপর ভিত্তি করে সমন্বয়, কিন্তু আপনি একই দ্বারা ঘূর্ণিত ওজন কমাতে প্রয়োজন মোট পরিমাণ যে আপনি অন্যান্য ওজন বৃদ্ধি। সুতরাং উপরের আমাদের উদাহরণে, আপনি ঘূর্ণিত ওজন 3 দ্বারা হ্রাস করতে এবং প্রতিটি ওজন প্রতি 1 দ্বারা বাড়িয়ে তুলবেন।

আপনি যদি প্রতিটি রোলের জন্য এটি করেন, আপনার কাছে এখনও রেখার সম্ভাবনা থাকবে তবে এগুলি খুব কমে যাবে, কারণ প্রতিটি রোলের জন্য আপনি এই সম্ভাবনাটি বাড়িয়ে দিচ্ছেন যে ভবিষ্যতের রোলগুলি বর্তমান রোলটি ছাড়া অন্য কিছু হবে। আপনি এই প্রভাবটি বাড়াতে পারেন এবং এরপরে আরও বড় ফ্যাক্টর দ্বারা ওজন বাড়িয়ে / কমিয়ে (যেমন বর্তমানের 6 টি কমিয়ে অন্যকে 2 দ্বারা বাড়িয়ে তোলা) স্ট্রাইকের সম্ভাবনা আরও কমাতে পারেন।

আমি এই পদ্ধতির বৈধতা দেওয়ার জন্য একটি দ্রুত অ্যাপ্লিকেশন চালিয়েছি এবং সেই ওজনগুলির সাথে 32000 পুনরাবৃত্তির পরে এটি নিম্নলিখিত গ্রাফগুলি তৈরি করে। উপরের গ্রাফটি প্রতিটি রোলের 4 টি ওজনের তাত্ক্ষণিক মানগুলি দেখায় এবং নীচের গ্রাফটি প্রতিটি ধরণের ফলাফলের সমষ্টি গণনাটি সেই বিন্দুতে দেখায়।

আপনি দেখতে পাচ্ছেন যে ওজনগুলি তাদের কাঙ্ক্ষিত মানগুলির আশেপাশে কিছুটা ওঠানামা করে, তবে সামগ্রিক ওজনগুলি কাঙ্ক্ষিত ব্যাপ্তির মধ্যেই থাকে এবং প্রারম্ভিক সংখ্যার প্রাথমিক বৈচিত্রগুলি স্থির হওয়ার পরে, ফলাফলগুলি আমাদের কাঙ্ক্ষিত শতাংশ প্রায় পুরোপুরি ফিট করে।

নোট করুন যে এই উদাহরণটি .NET সিস্টেম.রেন্ডম ক্লাসটি ব্যবহার করে তৈরি করা হয়েছিল, যা সত্যিকার অর্থেই সেখানে আরএনজি করা ভাল নয়, সুতরাং আপনি আরও ভাল আরএনজি ব্যবহার করে আরও সঠিক ফলাফল পেতে পারেন। এছাড়াও নোট করুন যে 32000 হ'ল আমি এই সরঞ্জামটির সাহায্যে গ্রাফ করতে পারব এমন সর্বোচ্চ ফলাফল ছিল তবে আমার পরীক্ষার সরঞ্জামটি একই সামগ্রিক নিদর্শনগুলির সাথে 500 মিলিয়নেরও বেশি ফলাফল অর্জন করতে সক্ষম হয়েছিল।


মনে রাখবেন যে এটি যদি কেবলমাত্র আপনার ব্যবহৃত +1 / -3s সর্বাধিক ব্যবহৃত ওজনের পরিবর্তে মূল ওজনের সাথে সম্পর্কিত হয় works (এইভাবে ওজনকে অবিচ্ছিন্নভাবে অবিচ্ছিন্নভাবে সংশোধন করা তাদেরকে বৈষম্যমূলক হওয়ার দিকে চালিত করে তোলে)। যদিও এটি সম্ভাব্যতাটিকে দীর্ঘমেয়াদী লক্ষ্য করে রাখে, রান কমাতে এটি খুব কম করে little প্রদত্ত যে আমি একবার মিস করেছি, এই সুযোগটি আমি একটানা আরও দুবার মিস করবো এই স্কিমের সাথে 22%, স্বাধীন অঙ্কনের সাথে 25% বনাম। একটি বড় প্রভাবের জন্য ওজন শিফট বৃদ্ধি (+3 / -9 বলুন) এর ফলে দীর্ঘমেয়াদে সম্ভাবনার পক্ষপাতিত্ব ঘটে।
ডিএমগ্রিগরি

প্রকৃতপক্ষে উপস্থাপিত ডেটা প্রতিবার কোনও রোল প্রক্রিয়া করার সময় সবচেয়ে সাম্প্রতিক ওজনের +1 / -3 প্রয়োগ করছে। সুতরাং আপনি যদি প্রাথমিক 50% ওজনে একবার মিস করেন তবে পরবর্তী মিস ওজন 47% হবে এবং আপনি যদি আবার মিস করেন তবে নীচের ওজন 44% হবে ইত্যাদি। এটি রান হ্রাস করে (পৃথক মেট্রিক রানগুলি ট্র্যাক করে, রানে 24% হ্রাস হিসাবে পাওয়া যায়) তবে এগুলি এখনও অনিবার্য কারণ এই স্কিমটিতে এখনও 4 টি ওজনের প্রত্যেককেই শূন্যতার সম্ভাবনা ছাড়াই শক্তিশালী সম্ভাবনা রয়েছে ( উদাহরণস্বরূপ, এক সারিতে চারটি সমালোচক সমালোচনার ওজন হ্রাসের শূন্যতার সাথে ছেড়ে দেবে)।
ডেভিড সি এলিস

যদি এটি ছিল আপনার উদ্দেশ্য, তবে আপনার বাস্তবায়নে একটি বাগ রয়েছে। গ্রাফটি দেখুন - ভাসমান ওজন কেবল কখনও 7 এবং 11 এর মধ্যে বাউন্স করে, এর বাইরে কোনও মান নেই। আপনার বর্ণনা করা অবিচ্ছিন্ন পরিবর্তন ব্যবহার করে আমি একটি সিমুলেশন চালিয়েছি এবং প্রতিটি রাজ্যের সম্ভাব্যতা প্রথম শতাব্দীর পরীক্ষার মধ্যে 25% এর দিকে রূপান্তরিত হওয়ার সাথে গ্রাফগুলি একেবারে পৃথক।
ডিএমগ্রিগরি

ডাঙিত, আপনার নির্দেশ অনুসারে এটি বাগড হয়েছিল। ঠিক আছে, এই উত্তর ধর্মঘট।
ডেভিড সি এলিস

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

0

আপনি যা করতে পারেন তা মূলত একটি ফিল্টার। অতীত n ইভেন্টগুলি ট্র্যাক রাখুন। সম্ভাবনা হ'ল এই ইভেন্টগুলিতে প্রয়োগ হওয়া কিছু ফিল্টার। 0 তম ফিল্টারটি হ'ল বেস সম্ভাবনা, যদি 0 হয় তবে আপনি ডজড, যদি 1 ব্যর্থ হন। ধরা যাক বেসটি 25% ছিল এবং ফিল্টারটি প্রতিটি পুনরাবৃত্তির অর্ধেক দ্বারা হ্রাস পায়। আপনার ফিল্টারটি তখন হবে:

[.25 .125 .0625 .03125] 

আপনি যদি চান নিখরচায় চালিয়ে যান। এই স্কিমের সামগ্রিক সম্ভাবনা .25 এর বেস সম্ভাবনার চেয়ে কিছুটা বেশি। প্রকৃতপক্ষে, একই স্কিমটি দেওয়া সম্ভাবনাটি হ'ল (আমি এক্সকে প্রকৃত সম্ভাবনা বলছি, পি সম্ভাবনার ইনপুট):

x=p+(1-x)*(p/2+p/4+p/8)

এক্স এর জন্য সমাধান করা, উত্তরটি পাওয়া যায় p(1+1/2+1/4+1/8)/(1+p(1/2+1/4+1/8)বা আমাদের প্রদত্ত কেসটির জন্য x=0.38461538461,। তবে আপনি যা চান তা হল x, দেওয়া পি। এটি আরও একটি কঠিন সমস্যা হিসাবে দেখা যাচ্ছে। আপনি যদি অসীম ফিল্টার ধরে নিয়ে থাকেন তবে সমস্যাটি হয়ে যায় x+x*p=2*p, বা p=x/(2-x)। সুতরাং আপনার ফিল্টারটি বাড়িয়ে আপনি এমন একটি সংখ্যা পি সমাধান করতে পারবেন যা গড়ে আপনাকে একই ফলাফল দেয় তবে সম্প্রতি কতটা সাফল্য এসেছে তার উপর নির্ভর করে একটি হারে।

মূলত, আপনি পূর্বের মানগুলি গ্রহণযোগ্যতার প্রান্তটি এই বৃত্তটি কী তা নির্ধারণ করতে এবং একটি এলোমেলো মান গ্রহণ করেন। তারপরে ফিল্টার প্রদত্ত পরবর্তী এলোমেলো মান উত্পাদন করুন।


-1

আপনি যেমন নিজেকে প্রস্তাব করেছিলেন ঠিক তেমন পদ্ধতির একটি হ'ল ওয়েট্যান্ড এলোমেলো বাস্তবায়ন করা। ধারণাটি এমন একটি এলোমেলো সংখ্যার (বা ফলাফল) জেনারেটর তৈরি করা যেখানে ওজন এবং ফলাফলগুলি পরিবর্তন করা যায়।

জাভাতে এটির একটি বাস্তবায়ন এখানে দেওয়া হল।

import java.util.Map;
import java.util.Random;

/**
 * A psuedorandom weighted outcome generator
 * @param <E> object type to return
 */
public class WeightedRandom<E> {

    private Random random;
    private Map<E, Double> weights;

    public WeightedRandom(Map<E, Double> weights) {
        this.random = new Random();
        this.weights = weights;
    }

    /**
     * Returns a random outcome based on the weight of the outcomes
     * @return
     */
    public E nextOutcome() {
        double totalweight = 0;

        // determine the total weigth
        for (double w : weights.values()) totalweight += w;

        // determine a value between 0.0 and the total weight
        double remaining = random.nextDouble() * totalweight;

        for (E entry : weights.keySet()) {
            // subtract the weight of this entry
            remaining -= weights.get(entry);

            // if the remaining is smaller than 0, return this entry
            if (remaining <= 0) return entry;
        }

        return null;
    }

    /**
     * Returns the weight of an outcome
     * @param outcome the outcome to query
     * @return the weight of the outcome, if it exists
     */
    public double getWeight(E outcome) {
        return weights.get(outcome);
    }

    /**
     * Sets the weight of an outcome
     * @param outcome the outcome to change
     * @param weight the new weigth
     */
    public void setWeight(E outcome, double weight) {
        weights.put(outcome, weight);
    }
}

সম্পাদনা করুন আপনি যেখানে ওজন স্বয়ংক্রিয়ভাবে সামঞ্জস্য করতে চান সেই ক্ষেত্রে, উদাহরণস্বরূপ বি ফলাফল হওয়ার সময় এ এর ​​সম্ভাবনা বাড়িয়ে নিন আপনি পারেন,

  1. nextOutcome()পদ্ধতির আচরণ পরিবর্তন করুন , সুতরাং এটি ফলাফল অনুসারে ওজনকে পরিবর্তন করে
  2. setWeight()ফলাফল অনুযায়ী ওজন পরিবর্তন করতে ব্যবহার করুন ।

আমি মনে করি আপনার এই প্রশ্নটি ভুলভাবে পড়ে থাকতে পারে: ওপি ওজনে এলোমেলো ফলাফল কীভাবে উত্পন্ন করতে পারে তা জিজ্ঞাসা করছে না, তবে পর পর কয়েকবার একই ফলাফলের সম্ভাবনা কমাতে ওজনকে কীভাবে সামঞ্জস্য করা যায়।
ইলমারি করোনেন

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