যদি আরো ভালো করে বোজতে চান #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// ---------- ধ্রুবকসমূহ ----------
#define MAX_PEOPLE 1000
#define MAX_MEMBERS 500
#define ATTRITION_RATE 3 // ৩% (২.৫% টিউন করা যায়)
#define REPRESSION_BASE 0.03 // দমনের বেস ফ্যাক্টর
#define REPRESSION_THRESHOLD 8 // এই সংখ্যার বেশি সদস্য হলে দমন কার্যকর
// শিক্ষার স্তর
typedef enum {
NO_EDUCATION,
SCHOOL,
GRADUATE
} EducationLevel;
// ব্যক্তির অবস্থা
typedef struct {
int id;
bool isMember;
int stage; // 0: সাধারণ, 1: সক্রিয়, 2: প্রাক্তন
int monthsActive;
int friendCount;
int *friends; // বন্ধুদের আইডির অ্যারে
bool isUnemployed;
bool isAngry;
EducationLevel education;
// অন্যান্য প্রয়োজনীয় তথ্য
} Person;
// সংগঠন
typedef struct {
int memberIds[MAX_MEMBERS];
int memberCount;
float socialMediaPresence; // 0.0 - 1.0
int outreachCenters;
} Organization;
// ---------- ফাংশন প্রোটোটাইপ ----------
float clamp(float value, float min, float max);
float socialMediaCampaign(Person *people, int personIndex, Organization *org, float repression);
bool familyInfluence(Person *people, int personIndex, float repression);
float culturalOutreach(Person *p, Organization *org, float repression);
float ideologicalTraining(Person *p, float repression);
float createEnemyImage(Person *p, float repression);
float assignDuties(Person *p, float repression);
void simulateMonth(Person *people, int totalPeople, Organization *org);
// ---------- প্রধান ফাংশন ----------
int main() {
// উদাহরণ ডেটা
Person people[MAX_PEOPLE];
Organization org = { .memberCount = 0, .socialMediaPresence = 0.5, .outreachCenters = 2 };
// সিমুলেশন লুপ
for (int month = 0; month < 12; month++) {
simulateMonth(people, MAX_PEOPLE, &org);
}
return 0;
}
// ---------- ইউটিলিটি ফাংশন ----------
float clamp(float value, float min, float max) {
if (value < min) return min;
if (value > max) return max;
return value;
}
// ---------- রিক্রুটমেন্ট ফাংশনসমূহ ----------
// সোশ্যাল মিডিয়া ক্যাম্পেইন
float socialMediaCampaign(Person *people, int personIndex, Organization *org, float repression) {
// বেস সম্ভাবনা: 0.008 + 0.008 * socialMediaPresence
float baseProb = 0.008f + 0.008f * org->socialMediaPresence;
float prob = baseProb;
Person *p = &people[personIndex];
// বন্ধুদের প্রভাব: প্রতি সদস্য বন্ধুর জন্য +0.05
for (int f = 0; f < p->friendCount; f++) {
int fid = p->friends[f];
if (people[fid].isMember) {
prob += 0.05f;
}
}
// দমন প্রভাব বিয়োগ
prob -= repression;
return clamp(prob, 0.0f, 1.0f);
}
// পরিবারের প্রভাব
bool familyInfluence(Person *people, int personIndex, float repression) {
// এখানে সরাসরি bool ফেরত দেওয়া হচ্ছে (সফল/ব্যর্থ)
// ধরে নিচ্ছি ফাংশনটি নির্দিষ্ট ব্যক্তির উপর পরিবারের প্রভাব বিস্তার করছে
// দমন প্রভাব বিবেচনায় নেওয়া হচ্ছে
float prob;
Person *p = &people[personIndex];
if (p->isMember) {
prob = 12.0f; // ১২%
} else {
prob = 8.0f; // ৮%
}
// দমন প্রভাব বিয়োগ (শতাংশ হিসেবে)
prob -= repression * 100.0f;
if (prob < 0) prob = 0;
return (rand() % 100 < (int)prob);
}
// সাংস্কৃতিক প্রচারণা
float culturalOutreach(Person *p, Organization *org, float repression) {
// বেস: 0.025 + 0.015 * outreachCenters
float base = 0.025f + 0.015f * org->outreachCenters;
float prob = base;
if (p->isUnemployed) prob += 0.08f;
if (p->isAngry) prob += 0.12f;
prob -= repression;
return clamp(prob, 0.0f, 0.4f); // সর্বোচ্চ ৪০%
}
// আদর্শগত প্রশিক্ষণ
float ideologicalTraining(Person *p, float repression) {
float prob = 0.28f; // ২৮% বেস
if (p->education == GRADUATE) {
prob -= 0.18f; // শিক্ষিতরা কম প্রভাবিত
}
prob -= repression;
return clamp(prob, 0.0f, 0.45f);
}
// শত্রুচিত্র নির্মাণ
float createEnemyImage(Person *p, float repression) {
float prob = 0.32f;
prob -= repression;
return clamp(prob, 0.0f, 0.5f);
}
// দায়িত্ব বণ্টন
float assignDuties(Person *p, float repression) {
float prob = 0.22f;
prob -= repression;
return clamp(prob, 0.0f, 0.4f);
}
// মাসিক সিমুলেশন
void simulateMonth(Person *people, int totalPeople, Organization *org) {
// ---------- সদস্য হ্রাস (Attrition) ----------
for (int m = org->memberCount - 1; m >= 0; m--) {
int idx = org->memberIds[m];
// ৩% সম্ভাবনায় সদস্য পদ ছেড়ে দেয়
if (rand() % 100 < ATTRITION_RATE) {
people[idx].isMember = false;
people[idx].stage = 2; // প্রাক্তন
people[idx].monthsActive = 0;
// memberIds অ্যারে থেকে সরানো
for (int k = m; k < org->memberCount - 1; k++) {
org->memberIds[k] = org->memberIds[k+1];
}
org->memberCount--;
}
}
// ---------- দমন ফ্যাক্টর গণনা ----------
float repression = 0.0f;
if (org->memberCount > REPRESSION_THRESHOLD) {
repression = REPRESSION_BASE * (org->memberCount / (float)REPRESSION_THRESHOLD);
}
// ---------- নতুন সদস্য সংগ্রহ (প্রত্যেক ব্যক্তির জন্য) ----------
for (int i = 0; i < totalPeople; i++) {
if (people[i].isMember) continue; // ইতিমধ্যে সদস্য
float totalProb = 0.0f;
// বিভিন্ন প্রচেষ্টা থেকে সম্ভাবনা সংগ্রহ
totalProb += socialMediaCampaign(people, i, org, repression);
if (familyInfluence(people, i, repression)) {
// পরিবারের প্রভাব সরাসরি সিদ্ধান্ত নেয়, তাই আলাদা যোগ নয়
// ধরে নিচ্ছি এটি সফল হলে সদস্য করা হবে
people[i].isMember = true;
people[i].stage = 1;
people[i].monthsActive = 1;
org->memberIds[org->memberCount++] = i;
continue; // পরবর্তী ব্যক্তিতে চলে যান
}
totalProb += culturalOutreach(&people[i], org, repression);
totalProb += ideologicalTraining(&people[i], repression);
totalProb += createEnemyImage(&people[i], repression);
totalProb += assignDuties(&people[i], repression);
// গড় সম্ভাবনা (মোট প্রচেষ্টার সংখ্যা দিয়ে ভাগ) – অথবা অন্য কোনো নিয়ম
// এখানে সরলতার জন্য আমরা একটি থ্রেশহোল্ড ব্যবহার করছি
float avgProb = totalProb / 6.0f; // ৬টি ফাংশন (familyInfluence ছাড়া)
if ((rand() % 1000) < (int)(avgProb * 1000)) {
people[i].isMember = true;
people[i].stage = 1;
people[i].monthsActive = 1;
org->memberIds[org->memberCount++] = i;
}
}
}
ব্যাখ্যা (Explanation)
- (#define): কোডের শুরুতে সব ম্যাজিক নাম্বারগুলো সংজ্ঞায়িত করা হয়েছে, যা পরিবর্তন সহজ করে।
- এনাম ও স্ট্রাকচার: EducationLevel এবং Person স্ট্রাকচার ডেটা সংগঠিত রাখতে সাহায্য করে।
- clamp ফাংশন: মান নির্দিষ্ট সীমার মধ্যে রাখে।
- প্রত্যেক রিক্রুটমেন্ট ফাংশন: এখন repression প্যারামিটার নেয় এবং সম্ভাবনা থেকে তা বিয়োগ করে। আউটপুট clamp করা হয়।
- familyInfluence: এটিকে বুলিয়ান ফাংশন বানানো হয়েছে, কারণ এটি সরাসরি সিদ্ধান্ত দেয় (অন্য ফাংশনের মতো সম্ভাবনা ফেরত না দিয়ে)।
- simulateMonth:
- প্রথমে attrition প্রক্রিয়া সম্পন্ন হয়।
- তারপর repression ফ্যাক্টর গণনা করা হয়।
- প্রতিটি অ-সদস্য ব্যক্তির জন্য বিভিন্ন প্রচেষ্টার সম্ভাবনা যোগ করে গড় বের করে সিদ্ধান্ত নেওয়া হয়।