মুদ্রা ব্যবহার করে অভিন্ন বিতরণ করা এলোমেলো সংখ্যা তৈরি করা


25

তোমার একটা মুদ্রা আছে আপনি এটিকে যতবার ইচ্ছা ফ্লিপ করতে পারেন।

আপনি একটি এলোমেলো সংখ্যা তৈরি করতে চান যাতে একটি r < b যেখানে r , a , b Z + থাকেrar<br,a,bZ+

সংখ্যা বিতরণ অভিন্ন হতে হবে।

এটি সহজ তবে :ba=2n

r = a + binary2dec(flip n times write 0 for heads and 1 for tails) 

হলে কী হবে ?ba2n


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

উত্তর:


13

আপনি যা সন্ধান করছেন তা প্রত্যাখ্যানের নমুনা বা গ্রহণ-প্রত্যাখ্যান পদ্ধতির উপর ভিত্তি করে (নোট করুন যে উইকি পৃষ্ঠাটি কিছুটা প্রযুক্তিগত)।

এই পদ্ধতিটি এই ধরণের পরিস্থিতিতে কার্যকর: আপনি কোনও সেট থেকে কিছু এলোমেলো বস্তু বাছাই করতে চান ( আপনার ক্ষেত্রে সেটের একটি এলোমেলো পূর্ণসংখ্যা ), তবে আপনি কীভাবে এটি করবেন তা জানেন না তবে আপনি করতে (আপনার ক্ষেত্রে, একটি বৃহত্তর প্রথম সেট ধারণকারী সেট থেকে কিছু র্যান্ডম বস্তুর বাছাই [ একটি , 2 + + একটি ] কিছু যেমন যে 2 + + একটি ; এই সাথে সঙ্গতিপূর্ণ মুদ্রা ফ্লিপ)।[a,b][a,2k+a]k2k+abk

এ জাতীয় দৃশ্যে, আপনি ছোট সেটটিতে এলোমেলোভাবে কোনও উপাদান বাছাই না করা অবধি বড় সেট থেকে উপাদানগুলি বাছাই করতে থাকুন। আপনার ছোট সেট বড় যথেষ্ট আপনার বৃহত্তর সেট তুলনায় (আপনার ক্ষেত্রে, হয় তাহলে হিসাবে অনেক পূর্ণসংখ্যার দ্বিগুন সর্বাধিক ধারণ করে [ একটি , ] , যা ভাল যথেষ্ট) এই কার্যকরী।[a,2k+a][a,b]

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


3
মনে রাখবেন যে আমরা বিতে বিতরণ পেতে যদি থেকে নমুনাগুলি প্রত্যাখ্যান করি তবে প্রত্যাশার সংখ্যাটি প্রত্যাশিত | |AB(যেমন আমরা জ্যামিতিক বিতরণ নিয়ে একটি পরীক্ষা করি)। |A||B|
রাফেল

আমি কোথাও দেখে মনে করেছি যে রেঞ্জটি 2 পাওয়ার হিসাবে যথাযথভাবে করা সম্ভব নয় (কারণ হিসাবে দাঁড়ানো যেমন, 1/3 এর কোনও বাইনারি সম্প্রসারণের সমাপ্তি নেই)।
ভোনব্র্যান্ড

7

(প্রযুক্তিগত: উত্তরটি সংখ্যা fits x < বি এর সাথে ফিট করে )ax<b

যেহেতু আপনি আপনার মুদ্রাটি আপনার ইচ্ছামত যতবার উল্টাতে পারবেন তাই আপনি একটি সম্ভাবনাকে ঘনিষ্ঠ হিসাবে আপনার ইউনিফর্ম হিসাবে পেতে পারেন ভগ্নাংশ (বাইনারি রেডিক্স ব্যবহার করে: আপনি ফ্লিপ করুন বিন্দু পরে প্রতিটি অঙ্ক) এবং সংখ্যাবৃদ্ধি জন্য মুদ্রা R দ্বারা বিএ 0 এবং [বিএ 1] (একটি পূর্ণসংখ্যা নিচে rounding) এর মধ্যে একটি সংখ্যা জন্য। এই নম্বর যোগ করুন একটি এবং আপনার কাজ সম্পন্ন হয়।r[0,1]rbaa

উদাহরণ : । বাইনারিটিতে 1/3 হয় 0.0101010101 .... তারপরে, যদি আপনার ফ্লিপ 0 এবং 0.010101 এর মধ্যে হয় ... আপনার পিকটি খ হয় । যদি এটা beween 0.010101 .. এবং 0.10101010 হয় ... আপনার পছন্দ হতে হবে একটি + + 1 , এবং অন্যথায় এটা হবে একটি + + 2ba=3ba+1a+2

আপনি আপনার মুদ্রা টুসকি যদি তারপর বার মধ্যে প্রতিটি সংখ্যা একটি এবং সম্ভাব্যতা সঙ্গে নির্বাচন করা হবে 1tab1ba±2(t+1)


1
এটি অভিন্ন বিতরণ দেয় না। কিছু অ্যাপ্লিকেশনগুলির জন্য (যেমন ক্রিপ্টো, কখনও কখনও), এটি খুব খারাপ হতে পারে।
গিলস

3
@ গিলস: ফল পরিবর্তন হওয়া আর সম্ভাব্য না হওয়া অবধি উল্টাপাল্টা করে পুরোপুরি অভিন্ন বিতরণ দেওয়া ঠিক করা যেতে পারে। এটি সবচেয়ে দক্ষ উত্তর।
নিল জি

@ নীলজি আমি জানি এটি স্থির করা যেতে পারে তবে এটি ঠিক করা উত্তরের একটি গুরুত্বপূর্ণ অংশ হবে।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

2
(ba)(f+2t1)(ba)(f2t1)

@ নীলজি, এটি "স্থির" হতে পারে না, কারণ সেখানে যথেষ্ট পরিমাণে পূর্ণসংখ্যার সেট রয়েছে যার মধ্যে বাইনারি ভগ্নাংশের অবসান হয় না।
ভনব্র্যান্ড

7

ba

n = b-a;
N = round_to_next_larger_power_of_2(n)
while (1) {
  x = random(0 included to N excluded);
  if (x < n) break;
}
r = a + x;

4
এবং কেন এই কাজ করে?
রাফেল

@ রাফেল আপনি সন্দেহবাদী না আপনি কি পোস্টারটি আরও বিশদভাবে ব্যাখ্যা করতে চান?
সুরেশ

1
@ সুরেশ: পরেরটি। সিউডো কোডটি কিছুটা পালিশ করা যেতে পারে, তবে এটি অন্যান্য উত্তরদাতারা কী ব্যাখ্যা করে তা কার্যকর করে। ন্যায়সঙ্গততা ছাড়াই, এই উত্তরটি নিজের পক্ষে খুব বেশি মূল্যবান নয়।
রাফেল


3

বা যদি 2 এর শক্তি না হয় তবে ফলাফল পেতে আপনাকে অনেক কয়েন ফ্লিপ করতে হতে পারে। আপনি এমনকি কখনও ফলাফল নাও পেতে পারেন, তবে চূড়ান্ত ক্ষেত্রে এটি অসম্ভব।

পদ্ধতি

সবচেয়ে সহজ পদ্ধতি হ'ল [a, a + 2 ^ n) এ একটি সংখ্যা তৈরি করা, যেখানে 2 ^ n> = বা, যতক্ষণ না কেউ [আ, খ) এর অবতরণ ঘটে। আপনি এই পদ্ধতিটি দিয়ে প্রচুর এনট্রপি ছুঁড়ে ফেলেছেন।

একটি আরও ব্যয়বহুল পদ্ধতি আপনাকে সমস্ত এনট্রপি রাখার অনুমতি দেয়, তবে মুদ্রা ফ্লিপ / ডাইস রোলগুলির সংখ্যা বাড়ার সাথে সাথে এটি কম্পিউটারে খুব ব্যয়বহুল হয়ে ওঠে। স্বজ্ঞাতভাবে এটি মুদ্রা ফ্লিপের সাথে দশমিক বিন্দুর ডানদিকে বাইনারি সংখ্যার অঙ্ক হিসাবে চিকিত্সা করা, সেই সংখ্যাটি বেস 2 থেকে বেস অব এজে রূপান্তর করা এবং সেই সংখ্যার অঙ্কগুলি 'আটকে' যাওয়ার সাথে সাথে ফিরে আসার মতো।

উদাহরণ

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

public static IEnumerable<BigInteger> DigitConversion(this IEnumerable<BigInteger> inputStream, BigInteger modIn, BigInteger modOut) {
    //note: values are implicitly scaled so the first unfixed digit of the output ranges from 0 to 1
    Rational b = 0; //offset of the chosen range
    Rational d = 1; //size of the chosen range
    foreach (var r in inputStream) {
        //narrow the chosen range towards the real value represented by the input
        d /= modIn;
        b += d * r;
        //check for output digits that have become fixed
        while (true) {
            var i1 = (b * modOut).Floor();
            var i2 = ((b + d) * modOut).Floor(); //note: ideally b+d-epsilon, but another iteration makes that correction unnecessary
            if (i1 != i2) break; //digit became fixed?
            //fix the next output digit (rescale the range to make next digit range from 0 to 1)
            d *= modOut;
            b *= modOut;
            b -= i1;
            yield return i1;
        }
    }
}

0

2

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

(সম্পাদনা) ফুলের ব্যাখ্যা: বলুন আপনি প্রতিটি 1/3 সম্ভাব্যতার সাথে 1 থেকে 3 সমেত একটি এলোমেলো পূর্ণসংখ্যার উত্পাদন করতে চান। আমরা পরিসীমা (0, 1) এলোমেলোভাবে বাইনারি দশমিক আসল তৈরি করে এটি করি। যদি x <1/3, 1 ফিরে আসুন, অন্যথায় যদি x <2/3 2 ফিরে আসে তবে অন্যটি 3 আবার এক্সের জন্য অঙ্কগুলি তৈরি করার পরিবর্তে আমরা কেবলমাত্র x এর সর্বনিম্ন এবং সর্বাধিক সম্ভাব্য মানগুলির উপর নজর রাখি। প্রাথমিকভাবে, x এর সর্বনিম্ন মান 0 এবং সর্বাধিক হয় 1. আপনি যদি প্রথম দিকে ঝাঁকুন হন তবে দশমিক পয়েন্টের পিছনে x এর প্রথম সংখ্যা (বাইনারিতে) 1 হয় x এর সর্বনিম্ন সম্ভাব্য মান (বাইনারি) পরে 0.100000 হয় = 1/2 এবং সর্বাধিক 0.111111111 = 1. এখন আপনার পরবর্তী ফ্লিপ যদি লেজ হয় তবে এক্স শুরু হয় 0.10। সর্বনিম্ন সম্ভাব্য মান 0.1000000 = 1/2 এবং সর্বোচ্চ 0.1011111 = 3/4। X এর সর্বনিম্ন সম্ভাব্য মান 1/2 হয় তাই আপনি সেখানে জানেন এর জন্য x ফেরানোর কোনও সুযোগ নেই কারণ এর জন্য x </ 3 প্রয়োজন। X এর 1/2 <x <2/3 বা 3/2 যদি 2/3 <x <3/4 হয় তবে আপনি 2 টি ফিরে আসতে পারেন। এখন ধরা যাক তৃতীয় ফ্লিপটি লেজ। তারপরে এক্সটি অবশ্যই 0.100 দিয়ে শুরু করতে হবে। ন্যূনতম = 0.10000000 = 1/2 এবং সর্বোচ্চ = 0.100111111 = 5/8। এখন থেকে 1/3 <1/2 <5/8 <2/3 আমরা জানি যে এক্স অবশ্যই ব্যবধানে পড়তে হবে (1/3, 2/3), তাই আমরা এক্স এর অঙ্ক উত্পন্ন করা বন্ধ করতে পারি এবং কেবল 2 ফিরে আসতে পারি।

কোডটি 0 এবং 1 এর মধ্যে x উত্পন্ন করার পরিবর্তে মূলত এটি করে কারণ এটি a এবং b এর মধ্যে x উত্পন্ন করে, তবে মূলনীতিটি একই।

def gen(a, b):
  min_possible = a
  max_possible = b

  while True:
    floor_min_possible = floor(min_possible)
    floor_max_possible = floor(max_possible)
    if max_possible.is_integer():
      floor_max_possible -= 1

    if floor_max_possible == floor_min_possible:
      return floor_max_possible

    mid = (min_possible + max_possible)/2
    if coin_flip():
      min_possible = mid
    else:
      max_possible = mid

মন্তব্য: আমি এই কোডটি গ্রহণ / প্রত্যাখ্যান পদ্ধতির বিরুদ্ধে এবং উভয়ই ইউনিফর্ম বিতরণের ফলন করেছি। এই কোডটির কাছে খ-এর গ্রহণযোগ্যতার চেয়ে কম কয়েন ফ্লিপগুলি দরকার যখন খ - ক এর পরের শক্তির 2 এর কাছাকাছি থাকে প্রাক্তন যদি আপনি একটি = 0, বি = 62 উত্পন্ন করতে চান তবে গ্রহণ / প্রত্যাখ্যান আরও ভাল হয়। আমি প্রমাণ করতে সক্ষম হয়েছি যে এই কোডটি গ্রহণ / প্রত্যাখ্যান করার চেয়ে গড়ে 2 টির বেশি মুদ্রা ফ্লিপ ব্যবহার করতে পারে। আমার পড়া থেকে দেখে মনে হচ্ছে নুথ এবং ইয়াও (1976) এই সমস্যাটি সমাধানের জন্য একটি পদ্ধতি দিয়েছেন এবং প্রমাণ করেছেন যে মুদ্রা প্রত্যাশিত সংখ্যায় তাদের পদ্ধতিটি সর্বোত্তম। তারা আরও প্রমাণ করেছে যে প্রত্যাশিত ফ্লিপের সংখ্যা অবশ্যই বিতরণের শ্যানন এনট্রপির চেয়ে বেশি হওয়া উচিত। আমি অবশ্য কাগজের পাঠ্যের একটি অনুলিপি খুঁজে পাইনি এবং তাদের পদ্ধতিটি কী তা জানতে আগ্রহী হব। (আপডেট: সবেমাত্র নুথ ইয়াও 1976 এর একটি প্রদর্শনী এখানে পেয়েছে:http://www.nrbook.com/devroye/Devroye_files/chapter_fifteen_1.pdf তবে আমি এখনও এটি পড়িনি)। কেউ এই থ্রেডে হান হোশি উল্লেখ করেছিলেন যা আরও সাধারণ বলে মনে হয় এবং এটি পক্ষপাতদুষ্ট মুদ্রা ব্যবহার করে সমাধান করে। সাহিত্যের একটি ভাল আলোচনার জন্য পে (২০০৯) দ্বারা http://paper.ijcsns.org/07_book/200909/20090930.pdf দেখুন ।



1

এটি ক্ষেত্রে প্রস্তাবিত সমাধান যখন খ - ক 2 ^ কে সমান হয় না। এটি নির্দিষ্ট সংখ্যক পদক্ষেপে কাজ করার কথা রয়েছে (আপনার প্রত্যাশিত সীমার বাইরে থাকা প্রার্থীদের ফেলে দেওয়ার দরকার নেই)।

তবে আমি নিশ্চিত যে এটি সঠিক। দয়া করে সমালোচনা করুন এবং এই এলোমেলো নম্বর জেনারেটরে (যদি থাকে তবে) এবং এটি কীভাবে পরিমাপ / পরিমাণ নির্ধারণ করবেন তার সঠিক অ-অভিন্নতা বর্ণনা করতে সহায়তা করুন।

প্রথমে সমানভাবে বিতরণ করা এলোমেলো সংখ্যাগুলিকে পরিসীমা [0, z-1] এ উত্পাদন করার সমমানের সমস্যায় রূপান্তর করুন যেখানে z = b - a।

এছাড়াও, মি = 2 ^ কে 2> = জেডের ক্ষুদ্রতম শক্তি হতে দিন।

উপরের সমাধান অনুসারে, ইতিমধ্যে [0, m-1] পরিসীমাতে আমাদের কাছে ইতিমধ্যে অভিন্ন বিতরণ করা এলোমেলো সংখ্যা জেনারেটর আর (এম) রয়েছে (প্রতিটি বিটের জন্য একটি করে কে মুদ্রা টস করে করা যেতে পারে)।

    Keep a random seed s and initialize with s = R(m).   

    function random [0, z-1] :
        x = R(m) + s 
        while x >= z:
            x -= z
        s = x
        return x

যখন লুপটি সর্বোচ্চ ৩ বার চলে, তারপরে স্থির সংখ্যক স্থানে (সেরা ক্ষেত্রে = সবচেয়ে খারাপ ক্ষেত্রে) পরবর্তী র্যান্ডম নম্বর দেয় giving

[0,2] সংখ্যাগুলির জন্য এখানে একটি পরীক্ষা প্রোগ্রাম দেখুন: http://pastebin.com/zuDD2V6H


z=3m=41/2,1/4,1/4

সিউডো কোডের পাশাপাশি সংযুক্ত কোডটি আরও ঘনিষ্ঠভাবে দেখুন। এটি 0, 1 এবং 2 প্রায় সমান ফ্রিকোয়েন্সি সহ নির্গত করে ...
ভাইপথক

01/21/4

আপনি পুরো ফাংশনটি একটি একক লাইনের সাথে প্রতিস্থাপন করতে পারেন: s = (s + R (m))% z রিটার্ন করুন;
যুবাল ফিল্মাস

1

তাত্ত্বিকভাবে অনুকূল অ্যালগরিদম

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

আমি এখানে যে অ্যালগরিদম বর্ণনা করব তা নূথ এবং ইয়াও (1976) এর উপর ভিত্তি করে। তাদের কাগজে, তারা এও প্রমাণ করেছিল যে এই অ্যালগরিদম ন্যূনতম সম্ভাব্য প্রত্যাশিত মুদ্রা ফ্লিপগুলি অর্জন করে।

এটি উদাহরণস্বরূপ, অন্যান্য উত্তর দ্বারা বর্ণিত প্রত্যাখ্যান নমুনা পদ্ধতি বিবেচনা করুন। উদাহরণ হিসাবে, ধরুন আপনি 5 টির মধ্যে একটি সংখ্যক অভিন্ন তৈরি করতে চান [0, 4]। 2 এর পরবর্তী শক্তিটি 8 হয় তাই আপনি 3 বার মুদ্রাটি ফ্লিপ করুন এবং 8 পর্যন্ত একটি এলোমেলো সংখ্যা তৈরি করুন যদি সংখ্যা 0 থেকে 4 হয় তবে আপনি এটি ফিরিয়ে দিন। অন্যথায়, আপনি এটিকে ফেলে দিন এবং আরও 8 টি সংখ্যা তৈরি করুন এবং আপনি সফল না হওয়া পর্যন্ত আবার চেষ্টা করুন। আপনি যখন নম্বরটি ছুঁড়ে ফেলেছেন তখন আপনি কিছুটা এনট্রপি নষ্ট করেছেন। ভবিষ্যতের মুদ্রা ফ্লিপের সংখ্যা কমাতে আপনি প্রত্যাশায় যে সংখ্যাটি কমাতে পারেন তার পরিবর্তে আপনি শর্ত রাখতে পারেন। কংক্রিটের সাথে একবার আপনি [0, 7] নম্বরটি তৈরি করেন, যদি এটি [0, 4] হয় তবে ফিরে আসুন। অন্যথায়, এটি 5, 6 বা 7 হয় এবং আপনি প্রতিটি ক্ষেত্রে আলাদা কিছু করেন। যদি এটি 5 হয় তবে মুদ্রাটি আবার ফ্লিপ করুন এবং ফ্লিপের উপর ভিত্তি করে 0 বা 1 প্রদান করুন। যদি এটি 6, মুদ্রা ফ্লিপ করুন এবং 2 বা 3 এ ফিরে আসুন it's এটি যদি 7 হয় তবে মুদ্রাটি ফ্লিপ করুন; যদি এটি মাথা যায়, 4 ফিরে আসুন, যদি এটির লেজগুলি শুরু হয়।

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

কোডটি এখানে:

# returns an int from [0, b)
def __gen(b):
  rand_num = 0
  num_choices = 1

  while True:
    num_choices *= 2
    rand_num *= 2
    if coin.flip():
      rand_num += 1

    if num_choices >= b:
      if rand_num < b:
        return rand_num
      num_choices -= b
      rand_num -= b

# returns an int from [a, b)
def gen(a, b):
  return a + __gen(b - a)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.