র্যান্ড () একটি ছোট পরিসরের জন্য আবার একই সংখ্যা দেয়


9

আমি এমন একটি গেম সাজানোর চেষ্টা করছি যেখানে আমার 20x20 এর গ্রিড রয়েছে এবং আমি একটি প্লেয়ার (পি), একটি লক্ষ্য (টি) এবং তিনটি শত্রু (এক্স) প্রদর্শন করি। এগুলির একটিতে এক্স এবং ওয়াই সমন্বয় রয়েছে যা ব্যবহার করে নির্ধারিত হয়েছে rand()। সমস্যাটি হ'ল যদি আমি গেমটিতে আরও পয়েন্ট পাওয়ার চেষ্টা করি (শক্তির জন্য পুনরায় পরিশোধ) ইত্যাদি তারা এক বা একাধিক পয়েন্টের সাথে ওভারল্যাপ করে কারণ পরিসরটি ছোট (1 থেকে 20 অন্তর্ভুক্ত)।

এই আমার ভেরিয়েবল এবং আমি তাদেরকে কিভাবে বরাদ্দ করছি মান: ( COORDএকটি হল structশুধু একটি X এবং একটি ওয়াই সঙ্গে)

const int gridSize = 20;
COORD player;
COORD target;
COORD enemy1;
COORD enemy2;
COORD enemy3;

//generate player
srand ( time ( NULL ) );
spawn(&player);
//generate target
spawn(&target);
//generate enemies
spawn(&enemy1);
spawn(&enemy2);
spawn(&enemy3);

void spawn(COORD *point)
{
    //allot X and Y coordinate to a point
    point->X = randNum();
    point->Y = randNum();
}

int randNum()
{
    //generate a random number between 1 and gridSize
    return (rand() % gridSize) + 1;
}

আমি গেমটিতে আরও জিনিস যুক্ত করতে চাই তবে আমি যখন এটি করি তখন ওভারল্যাপের সম্ভাবনা বেড়ে যায়। এই সমাধানের জন্য কোনো উপায় আছে কি?


8
র্যান্ড () একটি খারাপ আরএনজি
র‌্যাচেট ফ্রিক

3
rand()একটি করুণাময় আরএনজি, এবং যাইহোক, যেমন একটি ছোট পরিসীমা সহ, আপনি কেবল সংঘর্ষের আশা করবেন না , সেগুলি প্রায় নিশ্চিত।
Deduplicator

1
যদিও এটি সত্য যে rand()লম্পট আরএনজি, এটি সম্ভবত একক প্লেয়ার গেমের জন্য উপযুক্ত এবং আরএনজি গুণমান এখানে সমস্যা নয়।
রোবট

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

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

উত্তর:


40

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

20 * 20 = 400 সম্ভাব্য স্প্যান পজিশনের গ্রিডে, কেবলমাত্র 24 টি সত্ত্বা তৈরি করার পরেও একটি সদৃশ স্প্যান পয়েন্ট আশা করা যায় (50% সম্ভাব্যতা)। 50 টি সত্তা সহ (এখনও পুরো গ্রিডের মাত্র 12.5%), নকলের সম্ভাবনা 95% এর বেশি। আপনি সংঘর্ষের সাথে মোকাবিলা করতে হবে।

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


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

7
আপনার যদি 20x20 ধারাবাহিক (বাস্তব) এক্সওয়াই প্লেনের বিপরীতে 20x20 চেকারবোর্ড থাকে তবে সংক্ষিপ্তসারগুলি পরীক্ষা করার জন্য আপনার কাছে যা আছে 400-কোষের অনুসন্ধানের টেবিল। এটি আজীবন।
জন আর স্ট্রোহম

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

2
@ রবিআরিয়াজ: যদি চেহারাটি খুব জটিল হয় তবে তার প্রথম পরামর্শটি ব্যবহার করুন: সম্ভাব্য 400 টি শুরু করার জন্য একটি তালিকা তৈরি করুন, এগুলি এলোমেলো করুন যাতে তারা এলোমেলোভাবে থাকে (অ্যালগরিদম সন্ধান করে), এবং তারপরে আপনার যখন প্রয়োজন তখন সামনে থেকে অবস্থানগুলি ব্যবহার শুরু করুন স্টাফ তৈরি করতে (আপনি ইতিমধ্যে কতজন ব্যবহার করেছেন তা ট্র্যাক করে রাখুন)। কোনও সংঘর্ষ নেই।
রিমকো গ্রিলিচ

2
@ রবিআরিয়াজ পুরো তালিকাটি বদল করার দরকার নেই, যদি আপনার কেবলমাত্র অল্প সংখ্যক এলোমেলো মান প্রয়োজন হয়, কেবল আপনার প্রয়োজনীয় অংশটি বদল করুন (যেমন, 1..400 এর তালিকা থেকে একটি এলোমেলো মান নিন, এটি সরান, এবং অবধি পুনরাবৃত্তি করুন) আপনার পর্যাপ্ত উপাদান রয়েছে)। বাস্তবে এটি কোনওভাবেই কোনওভাবে বদলানো অ্যালগরিদম কাজ করে।
ডোরাস

3

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

  1. মানচিত্রে সমস্ত সম্ভাব্য অবস্থানের জন্য রেফারেন্সের একটি সংগ্রহ সেটআপ করুন (২০x20 মানচিত্রের জন্য এটি 400 অবস্থান হবে)
  2. এই সংগ্রহের 400 থেকে এলোমেলোভাবে একটি অবস্থান বাছুন (র্যান্ড () এটির জন্য ভাল কাজ করবে)
  3. সম্ভাব্য অবস্থান সংগ্রহ থেকে এই সম্ভাবনাটি সরান (সুতরাং এটির এখন 399 টি সম্ভাবনা রয়েছে)
  4. সমস্ত সত্তার একটি নির্দিষ্ট অবস্থান না পাওয়া পর্যন্ত পুনরাবৃত্তি করুন

এতক্ষণ আপনি যে সেটটি থেকে বেছে নিচ্ছেন সেখান থেকে অবস্থানটি সরিয়ে দিচ্ছেন, দ্বিতীয় সত্তার একই অবস্থান পাওয়ার সম্ভাবনা নেই (যদি না আপনি একসাথে একাধিক থ্রেড থেকে অবস্থানগুলি বাছাই করেন)।

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


1

rand() % nআদর্শের চেয়ে কম হওয়া সম্পর্কিত

করছেন rand() % nএকটি অ-ইউনিফর্ম বিতরণ আছে। আপনি নির্দিষ্ট মানের একটি অপ্রয়োজনীয় সংখ্যা পাবেন কারণ মান সংখ্যা 20 এর একক নয়

এর পরে, rand()সাধারণত একটি লিনিয়ার কংগ্রেসনাল জেনারেটর (সেখানে আরও অনেকেই আছেন , সম্ভবত এটি সম্ভবত প্রয়োগ করা হয় - এবং আদর্শ পরামিতিগুলির চেয়ে কম সহ (পরামিতিগুলি নির্বাচন করার বিভিন্ন উপায় রয়েছে))। এর সাথে সবচেয়ে বড় সমস্যাটি হ'ল প্রায়শই এটির মধ্যে কম বিটগুলি (যেগুলি আপনি % 20টাইপ এক্সপ্রেশন দিয়ে পান) তা এলোমেলো নয়। আমি এক স্মরণ rand()বছর পূর্বে কোথা থেকে সর্বনিম্ন বিট থেকে alternated 1করতে 0প্রতিটি কলের মাধ্যমে rand()- এটি খুব র্যান্ডম ছিল না।

থেকে রান্ড (3) মানুষ পৃষ্ঠা:

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

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

করণীয় হ'ল আসলে একটি ভাল এলোমেলো নম্বর লাইব্রেরি ব্যবহার করা (যা ভাল এলোমেলো নম্বর দেয়) এবং তারপরে আপনি যে পরিসীমা চান তার মধ্যে এলোমেলো সংখ্যা জিজ্ঞাসা করুন।

কোডের একটি ভাল এলোমেলো সংখ্যার উদাহরণ (লিঙ্কযুক্ত ভিডিওতে 13:00 থেকে)

#include <iostream>
#include <random>
int main() {
    std::mt19937 mt(1729); // yes, this is a fixed seed
    std::uniform_int_distribution<int> dist(0, 99);
    for (int i = 0; i < 10000; i++) {
        std::cout << dist(mt) << " ";
    }
    std::cout << std::endl;
}

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

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    srand(time(NULL));
    for (int i = 0; i < 10000; i++) {
        printf("%d ", rand() % 100);
    }
    printf("\n");
}

এই উভয় প্রোগ্রাম চালান এবং তুলনা করুন যে আউটপুটে কতগুলি নির্দিষ্ট সংখ্যা আসে (বা আসে না) কতবার।

সম্পর্কিত ভিডিও: র‌্যান্ড () ক্ষতিকারক হিসাবে বিবেচিত

র‌্যাণ্ডের কিছু aspectsতিহাসিক দিকগুলি () নেথাকের মধ্যে বাগ তৈরি করে যা কারও নিজস্ব বাস্তবায়ন দেখে এবং বিবেচনা করা উচিত:

  • নেটহ্যাক আরএনজি সমস্যা

    র‌্যান্ড () নেটহ্যাকের এলোমেলো সংখ্যা জেনারেশনের জন্য খুব মৌলিক কাজ function নেটহ্যাক যেভাবে এটি ব্যবহার করে তা বগি বা এটি যুক্তিযুক্ত হতে পারে যে ল্যান্ডেন্ড 48 () ক্রপী সিউডো-এলোমেলো সংখ্যা তৈরি করে। (তবে, ল্যান্ড্যান্ড 48 () একটি সংজ্ঞায়িত পিআরএনজি পদ্ধতি ব্যবহার করে একটি লাইব্রেরি ফাংশন এবং যে কোনও প্রোগ্রাম এটি ব্যবহার করে সেই পদ্ধতির দুর্বলতাগুলি বিবেচনায় নেওয়া উচিত))

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

উপরের অংশটি ২০০৩ সাল থেকে হওয়া সত্ত্বেও এটি এখনও মনে রাখা উচিত কারণ আপনার লক্ষ্যযুক্ত গেমটি চালিত সমস্ত সিস্টেমে একটি ভাল র্যান্ড () ফাংশন সহ একটি আপ টু ডেট লিনাক্স সিস্টেম হতে পারে।

যদি আপনি কেবল নিজের জন্য এটি করছেন, আপনি কিছু কোড লিখে এনট দিয়ে আউটপুট পরীক্ষা করে আপনার র্যান্ডম নম্বর জেনারেটরটি কতটা ভাল তা পরীক্ষা করতে পারেন ।


এলোমেলো সংখ্যার বৈশিষ্ট্যগুলিতে

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

সংখ্যা বিতরণ

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

1 3 2 4 1 2 4 3

এর চেয়ে বেশি 'এলোমেলো':

1 3 3 2 1 4 4 2

গানের 'পরিবর্তন' এর জন্য আরও এটি: গানগুলি কীভাবে বদলানো যায় ?

পুনরাবৃত্তি মান

আপনি যদি মানগুলি পুনরাবৃত্তি করতে না চান, তবে আলাদা ধারণা রয়েছে যা বিবেচনা করা উচিত। সমস্ত সম্ভাব্য মান উত্পন্ন করুন এবং এগুলি পরিবর্তন করুন।

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

তালিকা এবং বাছাই করুন

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

অদলবদল

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


3
Next, rand() is typically a linear congruential generatorএটি এখন অনেক প্ল্যাটফর্মে সত্য নয়। লিনাক্সের র্যান্ড (3) ম্যান পৃষ্ঠা থেকে: "লিনাক্স সি লাইব্রেরিতে র্যান্ড () এবং শ্রান্ড () এর সংস্করণগুলি র্যান্ডম (3) এবং শ্রান্ডম (3) হিসাবে একই র্যান্ডম সংখ্যার জেনারেটর ব্যবহার করে, তাই নিম্ন-অর্ডার বিট উচ্চতর অর্ডার বিটের মতো এলোমেলো হওয়া উচিত "" এছাড়াও, @ ডেলান উল্লেখ করেছেন যে, পিআরএনজির মান এখানে আসল সমস্যা নয়।
চার্লস ই। গ্রান্ট

4
আমি এটি হ্রাস করছি কারণ এটি আসল সমস্যার সমাধান করে না।
ব্যবহারকারী 253751

@ মিমিবিস তারপর অন্য উত্তরগুলি প্রকৃত সমস্যাটিকে "সমাধান" করে না এবং তা হ্রাস করা উচিত। আমি মনে করি যে প্রশ্নটি "আমার কোড ঠিক করুন" নয়, এটি "কেন আমি নকল র্যান্ডম নম্বর পাচ্ছি?" দ্বিতীয় প্রশ্নের কাছে, আমি বিশ্বাস করি যে প্রশ্নের উত্তর দেওয়া হয়েছে।
নিল

4
এমনকি RAND_MAX32767 এর ক্ষুদ্রতম মানের সাথেও পার্থক্যটি অন্যদের জন্য 1639 বনাম কিছু নম্বর পাওয়ার 1638 সম্ভাব্য উপায়। ওপিতে ব্যবহারিক পার্থক্যের সম্ভাবনা কম বলে মনে হচ্ছে।
মার্টিন স্মিথ

@ নীল "আমার কোড ঠিক করুন" কোনও প্রশ্ন নয়।
অরবিটে লাইটনেস রেস

0

এই সমস্যার সহজ সমাধানটি পূর্ববর্তী উত্তরে উদ্ধৃত করা হয়েছে: এটি আপনার 400 কোষের প্রত্যেকটির সাথে এলোমেলো মানগুলির একটি তালিকা তৈরি করা এবং তারপরে এই এলোমেলো তালিকাটি বাছাই করা। আপনার কক্ষের তালিকাটি এলোমেলো তালিকা হিসাবে বাছাই করা হবে এবং এইভাবে বদলে যাবে।

এ পদ্ধতিতে এলোমেলোভাবে নির্বাচিত কক্ষগুলির ওভারল্যাপিং এড়াতে সুবিধা রয়েছে।

অসুবিধাটি হ'ল আপনাকে আপনার প্রতিটি কক্ষের জন্য পৃথক তালিকায় একটি এলোমেলো মান গণনা করতে হবে । সুতরাং, আপনি খেলাটি শুরু হওয়ার পরিবর্তে এটি করছেন না।

আপনি এটি কীভাবে করতে পারেন তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

#include <algorithm>
#include <iostream>
#include <vector>

#define NUMBER_OF_SPAWNS 20
#define WIDTH 20
#define HEIGHT 20

typedef struct _COORD
{
  int x;
  int y;
  _COORD() : x(0), y(0) {}
  _COORD(int xp, int yp) : x(xp), y(yp) {}
} COORD;

typedef struct _spawnCOORD
{
  float rndValue;
  COORD*coord;
  _spawnCOORD() : rndValue(0.) {}
} spawnCOORD;

struct byRndValue {
  bool operator()(spawnCOORD const &a, spawnCOORD const &b) {
    return a.rndValue < b.rndValue;
  }
};

int main(int argc, char** argv)
{
  COORD map[WIDTH][HEIGHT];
  std::vector<spawnCOORD>       rndSpawns(WIDTH * HEIGHT);

  for (int x = 0; x < WIDTH; ++x)
    for (int y = 0; y < HEIGHT; ++y)
      {
        map[x][y].x = x;
        map[x][y].y = y;
        rndSpawns[x + y * WIDTH].coord = &(map[x][y]);
        rndSpawns[x + y * WIDTH].rndValue = rand();
      }

  std::sort(rndSpawns.begin(), rndSpawns.end(), byRndValue());

  for (int i = 0; i < NUMBER_OF_SPAWNS; ++i)
    std::cout << "Case selected for spawn : " << rndSpawns[i].coord->x << "x"
              << rndSpawns[i].coord->y << " (rnd=" << rndSpawns[i].rndValue << ")\n";
  return 0;
}

ফলাফল:

root@debian6:/home/eh/testa# ./exe 
Case selected for spawn : 11x15 (rnd=6.93951e+06)
Case selected for spawn : 14x1 (rnd=7.68493e+06)
Case selected for spawn : 8x12 (rnd=8.93699e+06)
Case selected for spawn : 18x13 (rnd=1.16148e+07)
Case selected for spawn : 1x0 (rnd=3.50052e+07)
Case selected for spawn : 2x17 (rnd=4.29992e+07)
Case selected for spawn : 9x14 (rnd=7.60658e+07)
Case selected for spawn : 3x11 (rnd=8.43539e+07)
Case selected for spawn : 12x7 (rnd=8.77554e+07)
Case selected for spawn : 19x0 (rnd=1.05576e+08)
Case selected for spawn : 19x14 (rnd=1.10613e+08)
Case selected for spawn : 8x2 (rnd=1.11538e+08)
Case selected for spawn : 7x2 (rnd=1.12806e+08)
Case selected for spawn : 19x15 (rnd=1.14724e+08)
Case selected for spawn : 8x9 (rnd=1.16088e+08)
Case selected for spawn : 2x19 (rnd=1.35497e+08)
Case selected for spawn : 2x16 (rnd=1.37807e+08)
Case selected for spawn : 2x8 (rnd=1.49798e+08)
Case selected for spawn : 7x16 (rnd=1.50123e+08)
Case selected for spawn : 8x11 (rnd=1.55325e+08)

কম বেশি বা কম এলোমেলো সেল পেতে কেবল NUMBER_OF_SPAWNS পরিবর্তন করুন, এটি কাজের জন্য প্রয়োজনীয় গণনার সময় পরিবর্তন করবে না।


"এবং তারপরে, তাদের সকলকে বাছাই করতে" - আমি বিশ্বাস করি আপনি "

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