আমার প্রসঙ্গে এই এলোমেলো সংখ্যা জেনারেশন কিভাবে উন্নত করবেন?


11

আমার গেমটিতে স্ক্রিনের শীর্ষে একটি শব্দ রয়েছে, উপর থেকে চিঠিগুলি বৃষ্টি হচ্ছে এবং শব্দটি সম্পূর্ণ করতে ব্যবহারকারীকে বর্ণগুলি স্পর্শ করতে হয়।

বর্তমানে আমি এলোমেলোভাবে চিঠিগুলি উত্পন্ন করছি (আসলে এলোমেলো সংখ্যা এবং সংখ্যা হ'ল বর্ণগুলির অ্যারের সূচক eg শব্দ।

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

আমি নিম্নলিখিত পদ্ধতিগুলি চেষ্টা করেছি:

  1. শব্দের সমস্ত অক্ষর শনাক্ত করুন (শব্দটি সর্বদা 6 অক্ষর দীর্ঘ), দৈর্ঘ্য 6 এর সূচকের অ্যারে তৈরি করুন, অ্যারের প্রতিটি সূচকটি বর্ণ -2 থেকে বর্ণ + 2 এ এলোমেলো সংখ্যায় নির্ধারণ করুন এবং শেষে এলোমেলোভাবে একটি সূচক চয়ন করুন অ্যারে থেকে প্রদর্শন করতে।

  2. এমন একটি নির্বাচক পরিবর্তনশীল আছে যার মান সীমার মধ্যে [0..2] এলোমেলোভাবে উত্পন্ন হয়েছে, যদি নির্বাচক == 0 তবে শব্দটি তৈরি করে এমন অক্ষর সনাক্ত করুন এবং এলোমেলোভাবে একটি অক্ষর বাছাই করুন, অন্যথায় এলোমেলোভাবে এজে থেকে কোনও বর্ণমালা পান।

এই দুটি পদ্ধতিই আমাকে কোনও সহায়তা দেয়নি। আপনি আমাকে সাহায্য করতে পারলে আমি খুব খুশি হব।

এটি পড়ার জন্য ধন্যবাদ, আমি আশা করি আপনি প্রশ্নটি বুঝতে পেরেছেন এবং আমি প্রতিক্রিয়াটির জন্য অপেক্ষা করছি।


2
"এই দুটি পদ্ধতিই আমাকে কোনও সহায়তা দেয়নি" কেন নয়? এই পদ্ধতিগুলির সাথে কী কাজ হয়নি?
ভায়ল্যানকোর্ট

আমি জানি না তবে সমস্ত বর্ণমালা প্রয়োজনীয় হতে এখনও 1 মিনিটের মতো খুব বেশি সময় নিচ্ছে।
দানিয়াল আজরাম

@ দানিয়ালআজরাম এই চিঠিগুলি প্রায়শই যথেষ্ট পরিমাণে উপস্থিত না হয় আপনার সম্ভবত আরও কিছুটা ফ্রিকোয়েন্সি বাড়ানো উচিত, কারণ আপনার সমস্যাটি হ'ল মনে হচ্ছে।
জেএফএ

উত্তর:


21

আপনি আসলে একটি এলোমেলো বিতরণ চান না। আমি এটিকে স্পষ্টভাবে উল্লেখ করছি, কারণ আমরা যা ডিজাইনের জন্য "এলোমেলো" বিবেচনা করি তা সাধারণত সত্য র্যান্ডম নয়।

এখন, এই বিষয়টি মাথায় রেখে চলুন কিছু টুইট করার মান যুক্ত করুন - এটি এমন জিনিস যা আপনি ডিজাইনটি "সঠিক" না মনে হওয়া পর্যন্ত মজা পাবেন।

ChooseLetter() {
    const float WordLetterProbability = 0.5f;
    if (Random.NextFloat01() < WordLetterProbability) {
        // Pick a random letter in the word
    }
    else {
        // Pick a random letter *not* in the word
    }
}

সম্ভাব্যতা নিয়ন্ত্রণ করে যে কীভাবে বেছে বেছে বেছে নেওয়া হয়েছে আপনাকে একটি শব্দ পত্র দেবে - ০.৫ এ, আপনি প্রায় প্রতিটি সময় মোটামুটি একটি শব্দপত্র পাবেন। 0.25 এ, চারটির মধ্যে একটিতে একটি শব্দপত্র ইত্যাদি হবে etc.

এটি এখনও কিছুটা সরল - কারণ এলোমেলোভাবে , ভাল, এলোমেলো , আপনি কতক্ষণ শব্দ অক্ষরের মাঝে যাবেন তার কোনও গ্যারান্টি নেই। (তত্ত্ব অনুসারে, আপনি কোনও শব্দ অক্ষর ছাড়াই চিরতরে যেতে পারেন , এটি কেবল খুব খুব সম্ভাবনা নয়)) পরিবর্তে, প্রতিবার আমরা একটি না পাওয়ার সাথে আমরা একটি শব্দের চিঠির সম্ভাবনা বাড়ানোর জন্য একটি উপাদান যুক্ত করতে পারি:

const float BaseWordLetterProbability = 0.5f;
const float WordLetterProbabilityIncrease = 0.25f;
float WordLetterProbability = BaseWordLetterProbability;
ChooseLetter() {
    if (Random.NextFloat01() < WordLetterProbability) {
        // Pick a random letter in the word
        WordLetterProbability = BaseWordLetterProbability;
    }
    else {
        // Pick a random letter *not* in the word
        WordLetterProbability += WordLetterProbabilityIncrease;
    }
}

ঠিক আছে, সুতরাং এখন আমরা কখনই শব্দ অক্ষর ছাড়াই দু'টি অক্ষরের বেশি যাই না। (কারণ, দুটি মিস করার পরে, আমাদের কাছে একটি শব্দের চিঠি পাওয়ার সম্ভাবনা রয়েছে))

অবশেষে, আমাদের কীভাবে কোনও শব্দে বর্ণ নির্বাচন করা কাজ করে তা বিবেচনা করা দরকার। খেলোয়াড়কে প্রকৃতপক্ষে যে অক্ষরগুলি প্রয়োজন সেগুলি সরবরাহ করার জন্য আমাদের সেট থেকে চিঠিগুলি সেগুলি সরিয়ে ফেলতে হবে we

উদাহরণস্বরূপ, শব্দটি যদি "পরীক্ষা" হয় এবং প্লেয়ারটির ইতিমধ্যে 's' থাকে তবে আমরা তাদের আর একটি 'দিতে চাই না, কারণ তাদের এটির প্রয়োজন নেই!

এখান থেকে, বাকিগুলি আপনার ডিজাইনে ফিট করার জন্য টুইট করছে।


কি দারুন! আপনি কীভাবে এটি নিয়ে এসেছেন?: p আমি আগামীকাল সকালে আপনার পদ্ধতিটি পরীক্ষা করব এবং আমার মনে হয় এটি কার্যকর হবে, আমি এই মেহোডটি পরীক্ষা করার পরে আরও প্রতিক্রিয়া জানাব। এই জাতীয় উত্তরের জন্য আপনাকে অনেক ধন্যবাদ।
দানিয়াল আজরাম

4
পরিসংখ্যান! গেম ডিজাইনার বা প্রোগ্রামার হিসাবে, পরিসংখ্যানগুলি খুব মূল্যবান। খুব কমপক্ষে, সম্ভাবনার একটি ধারণা (এবং কীভাবে তাদের একত্রিত করবেন) অত্যন্ত কার্যকর extremely
ACEfanatic02

1
একই জিনিস পরামর্শ দিতে আসা। দুর্দান্ত উত্তর। এও মনে রাখবেন, এর মতো সমাধানের জন্য সমস্যার মাত্রা প্রবর্তনের উপায় হতে পারে। সহজ = 0.5, মাঝারি = 0.25, শক্ত = 0.10। ইত্যাদি
তাসোস

আমি একমত যে এটি এলোমেলো নয়। এটি এলোমেলো, এটি কেবলমাত্র একটি সামান্য বিতরণ যেখানে আমরা সাধারণত অভিন্ন বন্টনের কথা ভাবি। এবং আপনার ধারণাকে যুক্ত করতে আমি কেবল "শব্দটিতে একটি এলোমেলো চিঠিটি বেছে নিন" এর চেয়ে আরও বেশি এগিয়ে যেতে চাই I'd আমি চিঠিগুলি বিতরণ করতাম যা সর্বাধিক দেখা যায়। উদাহরণস্বরূপ "মিসিসিপি" এর আরও বেশি প্রয়োজন এবং আমি তাদের আরও পছন্দ করি।
ব্লেইন


21

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

এটি প্রয়োগের একটি সহজ উপায় হ'ল প্রতিটি অক্ষরকে একটানা স্ট্রিংয়ে রেখে প্রতিটি অক্ষর যতটা আকাঙ্ক্ষিত দেখা যায় ততক্ষণে এবং তারপরে আপনার আরএনজিকে একটি এলোমেলো অবস্থান থেকে কোনও চিঠি নেওয়া উচিত। সিউডোকোড উদাহরণ:

const String letters = "AAAAAAAAABBCCDDDDEEEEEEEEEEEEFFGGGHHIIIIIIIIIJ/*...and so on...*/"

char randomLetter = letters[randomIntegerBetween(0, letters.length - 1)];

2
+1 এটি একটি ভাল ধারণা, তবে আমি সন্দেহ করি যে এখানে আরও মার্জিত বাস্তবায়ন রয়েছে।
ইভোরর

1
সংশ্লিষ্ট: codereview.stackexchange.com/q/94202/61072
Evorlor

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

4
এটি সমস্যার সমাধান করবে না। সমস্যাটি হ'ল গেমটি শেষ করতে ব্যবহারকারীর নির্দিষ্ট বর্ণের প্রয়োজন । বলুন তাদের একটি জেড দরকার? তখন কি? এটি কেবল বিরল অক্ষরগুলিকে আরও বেশি হতাশ করে তুলবে ব্যবহারকারীকে।
আশ্চর্যজনক ড্রিমস

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

4

এখানে এমন একটি একক প্যারামিটার ব্যবহার করে উন্নতি করার একটি উপায় kযা আপনি টুইট করতে পারেন।

কেবল একটি এলোমেলো চিঠি বাছাইয়ের পরিবর্তে:

  1. একটি এলোমেলো চিঠি চয়ন করুন A
  2. একটি এলোমেলো নম্বর চয়ন করুন X
  3. যদি X > k এবং A না হয়[list of remaining needed letters] থাকে তবে 1 এ আবার চেষ্টা করুন।

আরও ছোট k, প্রায়শই চূড়ান্ত চিঠিA হ'ল প্রকৃতপক্ষে প্রয়োজনীয়।

অ্যালগরিদম সাময়িকভাবে চিহ্নিত করতে কোনও মান সহ খেলুন k, যেমন k = 0.5 । আপনি যদি গেমটি খুব কঠিন বলে মনে করেন তবে এর 0.4পরিবর্তে চেষ্টা করুন, ইত্যাদি যতক্ষণ না আপনি কোনও যুক্তিসঙ্গত মান খুঁজে না পান। এটি সরাসরি আপনার সেট করতে অসুবিধা দেয় , উদাহরণস্বরূপ, খেলায় খেলোয়াড়ের অগ্রগতির সাথে সাথে আপনি বাড়াতে চাইতে পারেন।


উত্তরের জন্য ধন্যবাদ তবে এটি ACEfanatic02 এর উত্তর মত মনে হচ্ছে।
দানিয়াল আজরাম

3

একটি নির্দিষ্ট সময়ের মধ্যে প্রয়োজনীয় অক্ষরগুলি প্রদর্শিত হবে তার গ্যারান্টি দেওয়ার একটি সহজ উপায় হ'ল শব্দের বর্ণগুলি এবং বাকী বর্ণমালা (সম্ভবত পুনরাবৃত্তি করা) সহ একটি অ্যারে ভরাট ব্যবহার করা, তারপরে এলোমেলোভাবে অ্যারে পরিবর্তন করা (c ++ std :: random_shuffle স্ট্যান্ডার্ড লাইব্রেরিতে, আপনি যদি আলাদা ভাষা ব্যবহার করেন তবে এটি প্রয়োগ করা কঠিন নয়)।

আপনি যদি শব্দটির বর্ণগুলি আরও দ্রুত দেখানোর জন্য চান তবে অ্যারেতে শব্দ-বর্ণের আরও কপি রাখুন।


0

আপনি যদি সি ++ ব্যবহার করেন তবে আপনি ইতিমধ্যে বিদ্যমান বিতরণটি ব্যবহার করতে পারেন http://en.cppreferences.com/w/cpp/numeric/random/piecewise_constant_distribration

এটি ধ্রুবক সময় জটিলতা মোচড়িত করেছে যা নিষ্পাপ পদ্ধতির চেয়ে ভাল। উদাহরণ:

#include <iostream>
#include <string>
#include <map>
#include <random>
#include <numeric>

int main()
{
    constexpr double containedLetterWeight = 3.0;
    constexpr int iterations = 10000;
    std::string word = "DISTRIBUTION";

    std::mt19937 rng(123);

    std::vector<double> values('Z' - 'A' + 2);
    std::iota(values.begin(), values.end(), 0.0);

    std::vector<double> weights('Z' - 'A' + 1, 1.0);
    for(const auto& c : word) weights[c - 'A'] = containedLetterWeight;

    std::piecewise_constant_distribution<> dist(values.begin(), values.end(), weights.begin());

    std::map<char, int> results;
    for(int n = 0; n < iterations; ++n)
    {
        ++results[static_cast<char>(dist(rng)) + 'A'];
    }
    for(const auto& p : results)
    {
        std::cout << p.first << ' ' << static_cast<float>(p.second) / iterations << '\n';
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.