একটি সাধারণ বিতরণ একটি অভিন্ন বিতরণ রূপান্তর


106

আমি কীভাবে একটি অভিন্ন বিতরণকে (বেশিরভাগ এলোমেলো সংখ্যা জেনারেটর উত্পাদন করে, যেমন 0.0 এবং 1.0 এর মধ্যে) একটি সাধারণ বিতরণে রূপান্তর করতে পারি? আমি যদি আমার নির্বাচনের গড় এবং মানক বিচ্যুতি চাই?


3
আপনার কি ভাষার স্পেসিফিকেশন রয়েছে, বা এটি কেবল একটি সাধারণ অ্যালগরিদম প্রশ্ন?
বিল

3
সাধারণ অ্যালগরিদম প্রশ্ন। আমি কোন ভাষা যত্নশীল না। তবে আমি পছন্দ করব যে উত্তরটি কেবল সেই ভাষা সরবরাহ করে এমন নির্দিষ্ট কার্যকারিতার উপর নির্ভর না করে।
তেরহর্স্ট

উত্তর:


47

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

3
যেমন মার্সিনি টুইস্টার, বা আপনার কাছে অন্য পরামর্শ আছে?
গ্রেগ লিন্ড

47

প্রচুর পদ্ধতি রয়েছে:

  • বক্স মুলার ব্যবহার করবেন না । বিশেষত যদি আপনি অনেক গাউসি সংখ্যা আঁকেন। বক্স মুলার একটি ফল দেয় যা -6 থেকে 6 এর মধ্যে ক্ল্যাম্প করা হয় (ডাবল স্পষ্টতা ধরে নিলে জিনিসগুলি ভাসমানের সাথে আরও খারাপ হয়)) এবং এটি অন্যান্য উপলব্ধ পদ্ধতির চেয়ে সত্যই কম দক্ষ।
  • জিগুরাট ঠিক আছে, তবে একটি টেবিল দেখা দরকার (এবং ক্যাশে আকারের সমস্যার কারণে কিছু প্ল্যাটফর্ম-নির্দিষ্ট টুইট করা)
  • অনুপাতের ইউনিফর্মগুলি আমার পছন্দসই, কেবল কয়েকটি সংযোজন / গুণ এবং সময়ের লগ 1/50 তম (যেমন। সেখানে দেখুন )।
  • সিডিএফ ইনভার্ট করা দক্ষ (এবং উপেক্ষিত, কেন?), আপনি যদি গুগল অনুসন্ধান করেন তবে আপনার এটির দ্রুত প্রয়োগগুলি পাওয়া যায়। এটি কোয়াসি-র্যান্ডম সংখ্যার জন্য বাধ্যতামূলক।

2
আপনি কি [-6,6] ক্ল্যাম্পিং সম্পর্কে নিশ্চিত? এটি সত্য (যদি উইকিপিডিয়া পৃষ্ঠায় একটি নোটের উপযুক্ত) হয় তবে এটি একটি উল্লেখযোগ্য উল্লেখযোগ্য বিষয় point
redcalx

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

7
@ লকস্টার: এই অনাকাঙ্ক্ষিত সম্পত্তিটি বিপরীত সিডিএফ পদ্ধতি দ্বারা ভাগ করা হয়। Cimat.mx/~src/prope08/randomgauss.pdf দেখুন । এটি অভিন্ন আরএনজি ব্যবহার করে হ্রাস করা যেতে পারে যা শূন্যের খুব কাছাকাছি একটি ভাসমান পয়েন্ট সংখ্যা আনার শূন্যের সম্ভাবনা নেই। বেশিরভাগ আরএনজি করে না, যেহেতু তারা একটি (সাধারণত 64৪ বিট) পূর্ণসংখ্যার উত্পন্ন করে যা পরে ম্যাপ করা হয় [0,1]। এটি গাউসিয়ান ভেরিয়েবলগুলির লেজ স্যাম্পলিংয়ের জন্য এই পদ্ধতিগুলিকে অনুপযুক্ত করে তোলে (কমপুটেশনাল ফিনান্সিয়ায় কম / উচ্চ স্ট্রাইক বিকল্পগুলি ভাবেন)।
আলেকজান্দ্রি সি

6
@AlexandreC। কেবলমাত্র দুটি পয়েন্টে স্পষ্ট করে বলতে গেলে, 64৪-বিট সংখ্যা ব্যবহার করে লেজগুলি 8.57 বা 9.41 (লগ-ইন করার আগে [0,1) রূপান্তর করার সাথে সম্পর্কিত নিম্ন মানের) হয়ে যায় "। এমনকি যদি [-6, 6] এ আবদ্ধ হয় তবে এই পরিসরের বাইরে থাকার সম্ভাবনা প্রায় 1.98e-9, এমনকি বিজ্ঞানের বেশিরভাগ লোকের পক্ষে যথেষ্ট ভাল। 8.57 এবং 9.41 পরিসংখ্যানগুলির জন্য এটি 1.04e-17 এবং 4.97e-21 হয়ে যায়। এই সংখ্যাগুলি এত কম যে একটি বক্স মুলার স্যাম্পলিং এবং কথিত সীমা অনুসারে একটি সত্য গাউসী নমুনার মধ্যে পার্থক্য প্রায় খাঁটিভাবে একাডেমিক। আপনার যদি আরও ভাল প্রয়োজন হয় তবে কেবল তার মধ্যে চারটি যোগ করুন এবং 2 দিয়ে ভাগ করুন
Cra

6
আমি মনে করি বক্স মুলার ট্রান্সফর্মটি ব্যবহার না করার পরামর্শটি বিপুল পরিমাণ ব্যবহারকারীদের জন্য বিভ্রান্তিকর। এই সীমাবদ্ধতাটি সম্পর্কে জেনে রাখা দুর্দান্ত, তবে ক্রেজি কাস্টা উল্লেখ করেছেন যে বেশিরভাগ অ্যাপ্লিকেশন যেগুলি বহিরাগতদের উপর খুব বেশি নির্ভর করে না, সম্ভবত আপনাকে এই সম্পর্কে চিন্তা করার দরকার নেই। উদাহরণস্বরূপ, আপনি যদি কখনও নম্র ব্যবহার করে নমুনা নেওয়ার উপর নির্ভর করেন তবে আপনি বক্স মুলার ট্রান্সফর্ম (পোলার স্থানাঙ্ক ফর্ম) github.com/numpy/numpy/blob/… উপর নির্ভর করেছেন ।
আন্ড্রেয়াস গ্রিভাস

30

অন্য যে কোনও ফাংশনের ডিস্ট্রিবিউশন পরিবর্তন করা আপনার নিজের প্রয়োজন ফাংশনের বিপরীতটি ব্যবহার করে using

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

এটি জেনেরিক গণিতের পদ্ধতির - এটি ব্যবহার করে আপনি এখন যে কোনও সম্ভাবনা বা বিতরণ ফাংশন বেছে নিতে পারেন যতক্ষণ না এর বিপরীত বা ভাল বিপরীত সীমাবদ্ধতা থাকে।

আশা করি বিতরণটি ব্যবহার করার বিষয়ে ক্ষুদ্র মন্তব্যটির জন্য এটি সাহায্য করেছে এবং ধন্যবাদ এবং সম্ভাবনা নিজেই নয় thanks


4
+1 গাউসিয়ান ভেরিয়েবলগুলি উত্পন্ন করার জন্য এটি একটি উপেক্ষিত পদ্ধতি যা খুব ভালভাবে কাজ করে। বিপরীতমুখী সিডিএফকে এই ক্ষেত্রে নিউটন পদ্ধতির সাথে দক্ষতার সাথে গণনা করা যেতে পারে (ডেরাইভেটিভটি ই ^ {- টি ^ 2}), একটি প্রাথমিক আনুমানিক যুক্তিযুক্ত ভগ্নাংশ হিসাবে পাওয়া সহজ, সুতরাং আপনার ইরফ এবং এক্সপ্রেসের 3-4 মূল্যায়ন প্রয়োজন। আপনি যদি আধা-এলোমেলো নম্বর ব্যবহার করেন তবে এটি বাধ্যতামূলক, এমন একটি ক্ষেত্রে যেখানে আপনাকে গাউসিয়ান নম্বর পেতে অবশ্যই এক ইউনিফর্ম নম্বর ব্যবহার করতে হবে।
আলেকজান্দ্রি সি

9
নোট করুন যে আপনার সম্ভাব্য বন্টন ফাংশন নয়, संचयी বিতরণ ফাংশনটি উল্টাতে হবে to আলেকজান্দ্রে এটি বোঝায়, তবে আমি ভেবেছিলাম যে এটির আরও উল্লেখযোগ্যভাবে উল্লেখ করা ক্ষতিগ্রস্থ হতে পারে না - যেহেতু উত্তরটি
পিডিএফের

আপনি পিডিএফটি ব্যবহার করতে পারেন যদি আপনি এলোমেলোভাবে গড়ের সাথে সম্পর্কিত কোনও দিক নির্বাচন করতে প্রস্তুত হন; আমি কি ঠিক বুঝতে পারি?
মার্ক ম্যাকেন্না


1
এখানে এসই সম্পর্কিত আরও সুন্দর ব্যাখ্যা সহ আরও সাধারণীকরণের উত্তর রয়েছে।
ছদ্মবেশী

23

বক্স-মুলার রূপান্তরটির মেরু রূপটি ব্যবহার করে এখানে একটি জাভাস্ক্রিপ্ট বাস্তবায়ন করা হচ্ছে।

/*
 * Returns member of set with a given mean and standard deviation
 * mean: mean
 * standard deviation: std_dev 
 */
function createMemberInNormalDistribution(mean,std_dev){
    return mean + (gaussRandom()*std_dev);
}

/*
 * Returns random number in normal distribution centering on 0.
 * ~95% of numbers returned should fall between -2 and 2
 * ie within two standard deviations
 */
function gaussRandom() {
    var u = 2*Math.random()-1;
    var v = 2*Math.random()-1;
    var r = u*u + v*v;
    /*if outside interval [0,1] start over*/
    if(r == 0 || r >= 1) return gaussRandom();

    var c = Math.sqrt(-2*Math.log(r)/r);
    return u*c;

    /* todo: optimize this algorithm by caching (v*c) 
     * and returning next time gaussRandom() is called.
     * left out for simplicity */
}

5

আপনার সুবিধার জন্য কেন্দ্রীয় সীমাবদ্ধ উপপাদ্য উইকিপিডিয়া এন্ট্রি ম্যাথওয়ার্ল্ড এন্ট্রি ব্যবহার করুন।

অভিন্ন বিতরণকারী সংখ্যার এন তৈরি করুন, তাদের যোগফলগুলি, n * 0.5 কে বিয়োগ করুন এবং আপনার 0 এর সমান গড় এবং বৈকল্পিক সমান (1/12) * (1/sqrt(N))( প্রায় শেষের জন্য ইউনিফর্ম বিতরণে উইকিপিডিয়া দেখুন ) সহ একটি প্রায় সাধারণ বিতরণের আউটপুট রয়েছে

n = 10 আপনাকে অর্ধেক শালীন দ্রুত উপহার দেয়। আপনি যদি অর্ধেকেরও বেশি শালীন চান তবে টাইলার সলিউশনে যান (যেমন সাধারণ বিতরণে উইকিপিডিয়া প্রবেশে উল্লিখিত )


1
এটি কোনও বিশেষ ঘনিষ্ঠ স্বাভাবিকটি দেবে না ("লেজগুলি" বা শেষ-পয়েন্টগুলি সত্যিকারের সাধারণ বিতরণের খুব কাছে থাকবে না)। বাক্স-মুলার আরও ভাল, অন্যরা যেমন পরামর্শ দিয়েছে।
পিটার কে।

1
বক্স মুলারেরও লেজগুলিও ভুল আছে (এটি ডাবল যথার্থতায় -6 এবং 6 এর মধ্যে একটি সংখ্যা ফেরৎ দেয়)
আলেকজান্দ্রি সি

n = 12 (0 থেকে 1 সীমাতে 12 টি এলোমেলো সংখ্যার যোগফল এবং 6 টি বিয়োগ) এর ফলাফল stddev = 1 এবং গড় = 0 হয়। এটি তখন কোনও সাধারণ বিতরণ উত্পন্ন করতে ব্যবহৃত হতে পারে। কেবল পছন্দসই স্টাডিদেব দ্বারা ফলাফলকে গুণিত করুন এবং গড়টি যুক্ত করুন।
জেরিএম

3

আমি বক্স-মুলার ব্যবহার করব। এই সম্পর্কে দুটি জিনিস:

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

আপনি জেড স্কোরকে কীভাবে স্কেল করবেন?
তেরহর্স্ট

3
স্কেলড = গড় + এসডিডিএভ * জেডস্কোর // আপনাকে স্বাভাবিক দেয় (গড়, এসটিডিএভ ^ 2)
yoyoyoyosef

2

যেখানে আর 1, আর 2 এলোমেলো ইউনিফর্ম সংখ্যা:

1 এর এসডি সহ সাধারণ ডিস্ট্রিবিউটশন: স্কয়ার্ট (-2 * লগ (আর 1)) * কোস (2 * পাই * আর 2)

এটি হুবহু ... এই সমস্ত ধীর লুপগুলি করার দরকার নেই!


কেউ আমাকে সংশোধন করার আগে ... এখানেই আমি প্রায় অনুমানটি নিয়ে এসেছি: (1.5- (R1 + R2 + R3)) * 1.88। আমিও এটি পছন্দ করি
এরিক অ্যারোনস্টি

2

এটি অবিশ্বাস্য মনে হয় যে আমি আট বছর পরে এগুলিতে কিছু যুক্ত করতে পারলাম, তবে জাভার ক্ষেত্রে আমি পাঠকদের র্যান্ডম.অ্যানেক্সটগুশিয়ায় নির্দেশ করতে চাই point পদ্ধতিতে , যা আপনার জন্য গড় 0.0 এবং স্ট্যান্ডার্ড বিচ্যুতি 1.0 নিয়ে একটি গাউসিয়ান বিতরণ উত্পন্ন করে।

একটি সাধারণ সংযোজন এবং / বা গুণগুলি আপনার প্রয়োজনের গড় এবং মান বিচ্যুতি পরিবর্তন করবে।


1

স্ট্যান্ডার্ড পাইথন লাইব্রেরি মডিউলটি এলোমেলোভাবে যা চায় তা রয়েছে:


সাধারন বিতরণ (মিউ, সিগমা) সাধারণ বিতরণ। মিউ মানে, এবং সিগমা হ'ল মানক বিচ্যুতি।

নিজেই অ্যালগরিদমের জন্য পাইথন লাইব্রেরিতে এলোমেলো.পি.তে ফাংশনটি একবার দেখুন।

ম্যানুয়ালি প্রবেশ করানোর এখানে


2
দুর্ভাগ্যক্রমে, পাইথনের লাইব্রেরিতে কিন্ডারম্যান, এজে এবং মনোহান, জেএফ, "ইউনিফর্ম ডিভিয়েটসের অনুপাত ব্যবহার করে র্যান্ডম ভেরিয়েবলগুলির কম্পিউটার প্রজন্ম", এসিএম ট্রান্স ম্যাথ সফটওয়্যার, 3, (1977), পিপি 257-260 ব্যবহার করা হয়েছে। এটি একক একের চেয়ে সাধারণ মান উৎপন্ন করতে দুটি অভিন্ন র্যান্ডম ভেরিয়েবল ব্যবহার করে, সুতরাং ওপি যে ম্যাপিংটি চেয়েছিল সেটি কীভাবে এটি ব্যবহার করবে তা স্পষ্ট নয়।
ইয়ান

1

ডোনাল্ড নুথের বইটি আর্ট অফ কম্পিউটার প্রোগ্রামিংয়ের বই ৩.৪.১ বিভাগ থেকে এটি অ্যালগরিদম পি ( সাধারণ বিচ্যুতির জন্য পোলার পদ্ধতি ) এর আমার জাভাস্ক্রিপ্ট বাস্তবায়ন :

function normal_random(mean,stddev)
{
    var V1
    var V2
    var S
    do{
        var U1 = Math.random() // return uniform distributed in [0,1[
        var U2 = Math.random()
        V1 = 2*U1-1
        V2 = 2*U2-1
        S = V1*V1+V2*V2
    }while(S >= 1)
    if(S===0) return 0
    return mean+stddev*(V1*Math.sqrt(-2*Math.log(S)/S))
}

0

এক্সেলটিতে আপনার চেষ্টা করা উচিত বলে আমি মনে করি: =norminv(rand();0;1)। এটি এলোমেলো সংখ্যার উত্পাদন করবে যা সাধারণত শূন্যের সাথে বিতরণ করা উচিত এবং বৈকল্পিকতা একত্রিত করা উচিত। "0" যে কোনও মান দিয়ে সরবরাহ করা যেতে পারে, যাতে সংখ্যাগুলি পছন্দসই গড় হতে পারে এবং "1" পরিবর্তন করে আপনি আপনার ইনপুটটির বর্গক্ষেত্রের সমান বৈকল্পিক পাবেন।

উদাহরণস্বরূপ: =norminv(rand();50;3)MEAN = 50 VARIANCE = 9 এর সাথে সাধারণত বিতরণ করা সংখ্যায় ফল পাবেন।


0

প্রশ্ন আমি কীভাবে ইউনিফর্ম বিতরণকে (যেমন এলোমেলো সংখ্যা জেনারেটর উত্পাদন করে, যেমন 0.0 এবং 1.0 এর মধ্যে) একটি সাধারণ বিতরণে রূপান্তর করতে পারি?

  1. সফ্টওয়্যার বাস্তবায়নের জন্য আমি এমন কয়েকটি দম্পতি র্যান্ডম জেনারেটরের নাম জানি যা আপনাকে [0,1] (মের্সেন টুইস্টার, লিনিয়ার কংগ্রুয়েট জেনারেটর) এর মধ্যে সিউডো অভিন্ন র্যান্ডম ক্রম দেয়। একে এটিকে ইউ (এক্স) বলি

  2. এটি গাণিতিক অঞ্চল যা সম্ভাব্যতা তত্ত্ব বলা হয়। প্রথম জিনিস: আপনি যদি অবিচ্ছেদ্য ডিস্ট্রিবিউশন এফ দিয়ে আরভি মডেল করতে চান তবে আপনি কেবল এফ ^ -1 (ইউ (এক্স)) মূল্যায়নের চেষ্টা করতে পারেন। প্রাথমিকভাবে এটি প্রমাণিত হয়েছিল যে এই জাতীয় আরভিতে অবিচ্ছেদ্য বিতরণ এফ থাকবে।

  3. পদক্ষেপ 2 কোনও সমস্যা ছাড়াই বিশ্লেষণাত্মকভাবে এফ ^ -1 উদ্ভূত হতে পারে যখন কোনও গণনা পদ্ধতি ব্যবহার না করেই আরভি ~ এফ উত্পাদন করার জন্য উপযুক্ত হতে পারে। (যেমন এক্সপ্রেস ডিস্ট্রিবিউশন)

  4. সাধারণ বিতরণকে মডেল করার জন্য আপনি y1 * কোস (y2) কে ক্যাক্কুলেট করতে পারেন, যেখানে y1 [[0,2pi] তে সমান। এবং y2 হ'ল রিলে বিতরণ।

প্রশ্ন: আমি যদি আমার নির্বাচনের কোনও গড় এবং মানক বিচ্যুতি চাই?

আপনি সিগমা * এন (0,1) + এম গণনা করতে পারেন।

এটি দেখানো যেতে পারে যে এ জাতীয় স্থানান্তর এবং স্কেলিং N (মি, সিগমা) এর দিকে পরিচালিত করে


0

বক্স-মুলার রূপান্তরটির মেরু রূপটি ব্যবহার করে এটি একটি মতলব বাস্তবায়ন :

ফাংশন randn_box_muller.m:

function [values] = randn_box_muller(n, mean, std_dev)
    if nargin == 1
       mean = 0;
       std_dev = 1;
    end

    r = gaussRandomN(n);
    values = r.*std_dev - mean;
end

function [values] = gaussRandomN(n)
    [u, v, r] = gaussRandomNValid(n);

    c = sqrt(-2*log(r)./r);
    values = u.*c;
end

function [u, v, r] = gaussRandomNValid(n)
    r = zeros(n, 1);
    u = zeros(n, 1);
    v = zeros(n, 1);

    filter = r==0 | r>=1;

    % if outside interval [0,1] start over
    while n ~= 0
        u(filter) = 2*rand(n, 1)-1;
        v(filter) = 2*rand(n, 1)-1;
        r(filter) = u(filter).*u(filter) + v(filter).*v(filter);

        filter = r==0 | r>=1;
        n = size(r(filter),1);
    end
end

এবং histfit(randn_box_muller(10000000),100);এটি অনুরোধ ফলাফল: বক্স-মুলার মতলব হিস্টিফ

স্পষ্টতই এটি মাতলাব অন্তর্নির্মিত র‌্যাঙ্কের সাথে তুলনায় সত্যিই অদক্ষ ।


0

আমার কাছে নিম্নলিখিত কোড রয়েছে যা সম্ভবত সাহায্য করতে পারে:

set.seed(123)
n <- 1000
u <- runif(n) #creates U
x <- -log(u)
y <- runif(n, max=u*sqrt((2*exp(1))/pi)) #create Y
z <- ifelse (y < dnorm(x)/2, -x, NA)
z <- ifelse ((y > dnorm(x)/2) & (y < dnorm(x)), x, z)
z <- z[!is.na(z)]

0

এটি সাধারণ বিতরণের জন্য এলোমেলো সংখ্যা জেনারেটর লেখার চেয়ে দ্রুততর হওয়ার কারণে প্রয়োগকৃত ফাংশন রনরম () ব্যবহার করাও সহজ। নীচের কোডটি প্রমাণ হিসাবে দেখুন

n <- length(z)
t0 <- Sys.time()
z <- rnorm(n)
t1 <- Sys.time()
t1-t0

-2
function distRandom(){
  do{
    x=random(DISTRIBUTION_DOMAIN);
  }while(random(DISTRIBUTION_RANGE)>=distributionFunction(x));
  return x;
}

ফিরে আসার নিশ্চয়তা নেই, তা কি? ;-)
পিটার কে।

5
সুযোগ এড়াতে এলোমেলো সংখ্যাগুলি খুব গুরুত্বপূর্ণ।
ড্রয় নোকস

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