বীজ উপর ভিত্তি করে এলোমেলো শব্দ


16

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

printscreen

আমি ভেবেছিলাম যে আমি যদি সম্মিলিত স্থানাঙ্কগুলি ব্যবহার করি (যেমন প্রতিটি সংস্থার উভয় স্থানাঙ্ক থেকে গঠিত একটি পূর্ণসংখ্যার মধ্যে) প্রতিটি স্থানাঙ্কের আলাদা আলাদা সংখ্যা থাকবে। সেই নম্বরটি বীজ হিসাবে ব্যবহার করে আমি প্রত্যাশিত ছিলাম যে স্থানাঙ্কের আরজিবি মানের জন্য ব্যবহারের জন্য প্রতিটি স্থানাঙ্কের জন্য আলাদা আলাদা এলোমেলো সংখ্যা পাব।

এই কোডটি আমি ব্যবহার করেছি:

public class Generate {

static Random Random;

    public static int TileColor(int x, int y){          
        Random = new Random(Integer.valueOf(Integer.toString(x)+Integer.toString(y)));
        int b = 1 + Random.nextInt(50);
        int g = 1 + Random.nextInt(50);
        int r = 1 + Random.nextInt(50);
        int color = -Color.rgb888(r, g, b);
        return color;
    }
}

জাভা র‌্যান্ডম ফাংশনটি যেভাবে কাজ করে সে কারণে প্রোগ্রামটি তৈরি করে বা আমি কিছু ভুল করছি এবং আমার কি অন্য পদ্ধতির চেষ্টা করা উচিত?

আপডেট: আমি এখন নিম্নলিখিত কোডটি ব্যবহার করে কনটেনটেশনের চারপাশের সমস্যাগুলি থেকে মুক্তি পাওয়ার চেষ্টা করেছি:

public static int TileColor(int x, int y){  
            Randomy = new Random(y);
            Randomx = new Random(x);
            Random = new Random(Integer.valueOf(Integer.toString(Randomx.nextInt(1234))+Integer.toString(Randomy.nextInt(1234))));
            int b = 1 + Random.nextInt(100);
            int g = 1 + Random.nextInt(100);
            int r = 1 + Random.nextInt(100);
            int color = -Color.rgb888(r, g, b);
            return color;
}

একরকম, এটি একটি (আমার মতে) পর্যাপ্ত এলোমেলো চিত্রও সরবরাহ করেছে:

mew ইমেজ

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


3
জাভা এর র্যান্ডম সম্পর্কে নিশ্চিত না তবে আমি এটির সত্যিকারের এলোমেলো নয় এর পুরোপুরি নিশ্চিত ... পড়ুন এন.ইউইকিপিডিয়া.আর / উইকি / সিউডোরেন্ডম_নম্বার_জেনেটর আপনি কেন এই প্যাটার্নগুলি দেখেন তা বুঝতে পারবেন।
সালকেটার

23
অন্যান্য উত্তরগুলি থেকে অনুপস্থিত কিছু যা গুরুত্বপূর্ণ: প্রতিটি পিক্সেলের জন্য আরএনজি পুনরায় পরীক্ষা করবেন না। এটি একবারে বীজ করুন এবং এটির ভিত্তিতে আপনার চিত্রের সমস্ত পিক্সেলের জন্য একটানা মান উত্পন্ন করুন।
কনরাড রুডলফ

4
দ্রষ্টব্য: একটি সিউডোরডম সংখ্যা জেনারোটটি এক মাত্রায় অভিন্নভাবে বিতরণ করা হতে পারে তবে একাধিক মাত্রা ব্যবহার করার সময় ব্যর্থ হন ... আপনি কার্যকরভাবে পয়েন্ট 3 ডি (আর, জি এবং বি এবং 3 টি পৃথক স্থানাঙ্ক) তৈরি করছেন যাতে আপনার এলোমেলো জেনারেটরের প্রয়োজন হয় গ্যারান্টি দেয় যে এটির মানগুলি উত্পন্ন করে কেবল অভিন্নভাবে বিতরণ করা হয় না, তবে এটি যে ট্রিপলগুলি উত্পন্ন করে তা 3 ডি স্পেসে অভিন্নভাবে বিতরণ করা হয়।
বাকুরিউ

6
@ বাকুরিউ যদি এক্স, ওয়াই এবং জেড স্বতন্ত্র ইউনিফর্ম র্যান্ডম ভেরিয়েবল হয় তবে আমি নিশ্চিত যে (এক্স, ওয়াই, জেড) 3 ডি স্পেসে অভিন্ন।
জ্যাক এম

2
আপনি মার্সেন টুইস্টার এর মতো বিভিন্ন আরএনজি ব্যবহার করে পরীক্ষা করতে পারেন ।
কেভিন

উত্তর:


21

জাভার java.util.Randomবর্গ সাধারণত আপনি সিউডোরান্ডম সংখ্যার যা গেম ব্যবহারের জন্য ভাল যথেষ্ট ক্রমের দেয় 1 । তবে, সেই বৈশিষ্ট্যটি কেবল একটি বীজের উপর ভিত্তি করে একাধিক নমুনার ক্রমের ক্ষেত্রে প্রযোজ্য। আপনি যখন বর্ধিত বীজের মানগুলি দিয়ে আরএনজিটিকে পুনরায় পুনঃনির্মাণ করেন এবং প্রতিটি ক্রমের প্রথম মানটি দেখেন, এলোমেলো বৈশিষ্ট্যগুলি ততটা ভাল হবে না।

পরিবর্তে আপনি কি করতে পারেন:

  • একসাথে পিক্সেলগুলির পুরো অংশ তৈরি করতে একই বীজটি ব্যবহার করুন। উদাহরণস্বরূপ, যখন আপনার পিক্সেল 425: 487 এর রঙের মান প্রয়োজন, তখন স্থানাঙ্কগুলি 400: 400কে আরএনজিতে ফিড করুন, 10000 এলোমেলো রঙ উত্পন্ন করুন এবং সূচক 2587 (25 * 100 + 87) এ রঙটি ব্যবহার করুন। সেই খণ্ডটির প্রতিটি পিক্সেলের জন্য 10000 এলোমেলো রঙগুলি পুনরায় তৈরি এড়াতে সেই উপায়ে উত্পন্ন অংশগুলি ক্যাশে করা উচিত।
  • এলোমেলো নম্বর জেনারেটর ব্যবহার না করে স্থানাঙ্ক জোড়াটিকে রঙের মান হিসাবে রূপান্তর করতে বার্তা ডাইজেস্ট ফাংশনটি ব্যবহার করুন । বেশিরভাগ MDF এর আউটপুট এলোমেলোতার বেশিরভাগ পরীক্ষাগুলি পূরণের জন্য পর্যাপ্ত অনুমানযোগ্য। আরজিবি মানের জন্য আপনার আউটপুটটি 24 বিটের চেয়ে বেশি হয় তবে এগুলি কেটে ফেলা সাধারণত কোনও সমস্যা হয় না।

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

1 যখন একেবারে অপরিহার্য যে কেউ পরের সংখ্যাটি পূর্বাভাস দিতে পারে না, ধীর তবে কম অনুমানযোগ্য ব্যবহার করুনjava.security.SecureRandom


13

আপনার প্রোগ্রামটি পুনঃসূচনা করুন এমন প্রত্যেকের সমন্বয়গুলির একই রঙ হওয়া উচিত

সেক্ষেত্রে , আপনি পার্লিন শোরের মতো একটি নির্জনবাদী শোর ফাংশনটি ব্যবহার করতে চাইবেন বা সিমপ্লেক্স

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

বেশিরভাগ অংশে, অন্তর্নির্মিত ব্যবহার করে random() বা অনুরূপ ফাংশনটি আপনি যখনই প্রোগ্রামটি চালাবেন তখন আপনাকে বিভিন্ন মান দেয়, কারণ তারা ঘড়িটিকে ইনপুট বা অন্য কোনও সিডোরডম মান হিসাবে ব্যবহার করতে পারে।

অন্য বিকল্পটি হ'ল একবার, অফলাইনে "শব্দের মানচিত্র" তৈরি করা এবং তারপরে এটিকে আপনার এলোমেলো সংখ্যা উত্স হিসাবে ব্যবহার করুন।

আপনার বাস্তবায়নে, আপনি x এবং এর স্ট্রিং উপস্থাপনাগুলি সম্মতি দিচ্ছেন y। এটি খারাপ কারণ এটি ডোমেন জুড়ে অনন্য নয়। এই ক্ষেত্রে,

x    y   concatenated
40   20  4020
402   0  4020
10   10  1010
101   0  1010
12   34  1234
123   4  1234
1   234  1234

শুভকামনা!


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

1
পিক্সেল উত্পন্ন করার আগে ধ্রুব বীজের সাথে কেবল এলোমেলোভাবে বীজ দেওয়া কি যথেষ্ট নয়?
জ্যাক এম

1
@ জ্যাকএম যা পুরোপুরি খেলতে পিআরএনজি অ্যালগরিদমের উপর নির্ভর করে।
ডিভে 21

4
"আমি একবার একটি র্যান্ড () বাস্তবায়ন দেখেছি যা প্রতিটি মানকে পরবর্তী মানের জন্য একটি বীজ হিসাবে ব্যবহার করে।" সর্বাধিক অ-ক্রিপ্টোগ্রাফিক সিউডোরানডম নম্বর জেনারেটর কীভাবে কাজ করে না? তারা পরবর্তী র্যান্ডম নম্বর / রাজ্য তৈরি করতে ইনপুট হিসাবে আগের র্যান্ডম নম্বর (বা রাষ্ট্র) ব্যবহার করে।
জ্যাব

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

9

আসুন দেখুন আপনি ঠিক কী করছেন:

  • আপনি একে একে সমস্ত পিক্সেল লুপ করেছেন
  • প্রতিটি পিক্সেলের জন্য, আপনি এর স্থানাঙ্কগুলির সংমিশ্রণকে একটি বীজ হিসাবে ব্যবহার করেন
  • তারপরে আপনি প্রদত্ত বীজ থেকে একটি নতুন এলোমেলো শুরু করুন এবং 3 টি সংখ্যা বের করুন

এই সমস্ত ঠিকঠাক শোনায় তবে আপনি একটি নিদর্শন গ্রহণ করছেন কারণ:

১১,১০ এ পিক্সেল এবং ১১,১ এ পিক্সেল উভয়ই ১১১ নম্বর সীডেড যাতে তারা একই রঙের সাথে নিশ্চিত হন।

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


জিনিসটি হ'ল চিত্রটির ভিউটি স্থানান্তর করতে সক্ষম হওয়া উচিত (আরও ইতিবাচক স্থানাঙ্কে)। সুতরাং এই পদ্ধতিটি সম্পূর্ণরূপে কাজ করবে না
ড্রাগনফ্লাই

4
আসলে "এই সমস্ত" ঠিক মতো শোনাচ্ছে না - প্রতি পিক্সেলের জন্য একটি ডিটারমিনিস্টিক আরএনজি নিয়ে গবেষণা করা এক ভয়ঙ্কর কৌশল, যদি না বীজ নিজেই কোনও ক্রিপ্টোগ্রাফিক আরএনজি থেকে থাকে (এবং তারপরেও এটি বিতরণের সাথে সম্পর্কিত না হওয়ার কারণে একটি চক্রান্ত কৌশল)।
কনরাড রুডলফ

আপনি এই প্রসঙ্গে সংখ্যার সমাহার করার সঠিক উপায় অন্তর্ভুক্ত করতে পারেন। অর্থাৎ। (x + y * প্রস্থ)
Taemyr

1

একটি রঙ জেনারেটর তৈরি করুন, তারপরে আপনার টাইলের জন্য আপনার রঙ উত্পাদন করুন। একবারে বীজ! কমপক্ষে প্রতিটি টাইলের চেয়ে আপনাকে বীজ বানাতে হবে না।

public class RandomColorGenerator {
  private final int minValue;
  private final int range;
  private final Random random;
  public RandomColorGenerator(int minValue, int maxValue, Random random) {
    if (minValue > maxValue || (long)maxValue - (long)minValue > (long)Integer.MAX_VALUE) {
      throw new IllegalArgumentException();
    }
    this.minValue = minValue;
    this.range = maxValue - minValue + 1;
    this.random = Objects.requireNonNull(random);
  }

  public int nextColor() {
    int r = minValue + random.nextInt(range);
    int g = minValue + random.nextInt(range);
    int b = minValue + random.nextInt(range);
    return -Color.rgb888(r, g, b);
  }
}

public class Tile {
  private final int[][] colors;
  public Tile(int width, int height, RandomColorGenerator colorGenerator) {
    this.colors = new int[width][height];
    for (int x = 0; x < width; x++) {
      for (int y = 0; y < height; y++) {
        this.colors[x][y] = colorGenerator.nextColor();
      }
    }
  }

  public int getColor(int x, int y) {
    return colors[x][y];
  }
}

এবং ব্যবহার অনুসরণ অনুসরণ মত হবে:

RandomColorGenerator generator = new RandomColorGenerator(1, 100, new Random(0xcafebabe));
Tile tile = new Tile(300, 200, generator);
...
// getting the color for x, y:
tile.getColor(x, y);

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


1

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

উদাহরণ:

public static int TileColor(int x, int y){
        final MessageDigest md = MessageDigest.getInstance("MD5");
        final ByteBuffer b = ByteBuffer.allocate(8);
        b.putInt(x).putInt(y);
        final byte[] digest = md.digest(b.array());
        return -Color.rgb888(digest[0], digest[1], digest[2]);
}

দ্রষ্টব্য: রঙ.আরজিবি ৮৮৮ (..) কোথা থেকে এসেছে তা আমি জানি না, সুতরাং অনুমোদিত পরিসরটি কী তা আমি জানি না। 0-255 যদিও স্বাভাবিক।

বিবেচনা করার উন্নতি:

  • কর্মক্ষমতা উন্নত করতে ক্লাসের বাইরে মেসেজডিজাস্ট এবং বাইটবফার ভেরিয়েবলগুলি তৈরি করুন। এটি করতে আপনাকে বাইটবফারটি পুনরায় সেট করতে হবে এবং পদ্ধতিটি আর থ্রেড নিরাপদে থাকবে না।
  • ডাইজেস্ট অ্যারেতে বাইট মান 0-255 থাকবে, যদি আপনি অন্য রেঞ্জগুলি চান তবে আপনাকে সেগুলি সম্পর্কে কিছু গণিত করতে হবে।
  • আপনি যদি বিভিন্ন 'এলোমেলো' ফলাফল চান তবে আপনি একরকম 'বীজ' যুক্ত করতে পারেন। উদাহরণস্বরূপ বাইটবফার.এলোকট (12) এ পরিবর্তন করুন এবং একটি .পুটআইন্ট (বীজ) যুক্ত করুন।

1

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

তবে, অ-ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন রয়েছে যা মানগুলি তৈরি করতে পারে যা দ্রুতগতির পাশাপাশি আপনার উদ্দেশ্যে যথেষ্ট এলোমেলো। আমি সাধারণত যার কাছে পৌঁছাই তা হ'ল মুরহুরহাশ । আমি জাভা ব্যবহারকারী নই তবে মনে হচ্ছে সেখানে অন্তত একটি জাভা প্রয়োগ উপলব্ধ available যদি আপনি খুঁজে পান যে আপনার প্রতিটি পিক্সেলকে একবারে তৈরি করার পরিবর্তে এটির স্থানাঙ্কগুলি থেকে তৈরি করা দরকার এবং সেগুলি কোনও টেক্সচারে সঞ্চয় করা হয়, তবে এটি করার এটি একটি ভাল উপায়।


1

আমি 2000 এরও বেশি একটি প্রাইম ব্যবহার করব (সর্বাধিক সাধারণ রেজোলিউশন)
এটি হ্রাস করবে (বা সদৃশ বীজগুলি মুছে ফেলবে)

public class Generate {

    static Random Random;

    public static int TileColor(int x, int y){          
        Random = new Random(x + 2213 * y);
        int b = 1 + Random.nextInt(50);
        int g = 1 + Random.nextInt(50);
        int r = 1 + Random.nextInt(50);
        int color = -Color.rgb888(r, g, b);
        return color;
    }
}

0

Randomযথেষ্ট এলোমেলো। আপনি এটি দুটি প্রধান কারণে ভুল ব্যবহার করছেন।

  • এটি বারবার পুনরায় বীজযুক্ত করার জন্য ডিজাইন করা হয়নি। এলোমেলো বৈশিষ্ট্যগুলি এলোমেলো সংখ্যার একক ক্রমের জন্য ধারণ করে।
  • Integer.valueOf(Integer.toString(x)+Integer.toString(y))পিক্সেলগুলির মধ্যে বিশাল সংযোগ রয়েছে যা আপনি বপন করছেন।

আমি কেবলমাত্র নিম্নলিখিত কোডটির কিছু প্রকরণ ব্যবহার করব, যেখানে আপনি /programming/9624963/java-simplest-integer- এ উত্তরগুলি থেকে একটি হ্যাশ ফাংশন (Integer.getHashCode ব্যবহার করবেন না) বেছে নিতে পারেন where কাটা

public static int TileColor(int x, int y) {
    return hash(x ^ hash(y));
}

যেখানে হ্যাশ ফাংশন হতে পারে


0

আপনি সিস্টেমগুলি বর্তমান ঘড়ির সময়টিকে এভাবে বীজ হিসাবে ব্যবহার করে দেখতে পারেন:

Random random = new Random(System.currentTimeMillis())

আশা করি এটি আরও একটি এলোমেলো মান উত্পাদন করে।


যাইহোক, ড্যাম স্থানাঙ্কের জন্য ড্যাম মান তৈরি করে না।
ড্রাগনফ্লাই

0

এখানে একটি লাইনের স্ট্যাটিক শেডার ফাংশনটি নিয়ে এসেছি - পলটারজিস্ট (গোলমাল ঘোস্ট)।

এটি একটি 2 ডি সমন্বয় এবং একটি বীজ লাগে এবং অনুরোধ হিসাবে একঘেয়ে মধ্যে রেন্ডার করে। এটি পর্দার রেজোলিউশন নির্বিশেষে রিয়েলটাইম fps এ চলে। জিপিইউ এর জন্য এটি।

// poltergeist (noisy ghost) pseudo-random noise generator function
// dominic.cerisano@standard3d.com 03/24/2015

precision highp float;

float poltergeist(in vec2 coordinate, in float seed) 
{
    return fract(sin(dot(coordinate*seed, vec2(12.9898, 78.233)))*43758.5453); 
}

void mainImage(out vec4 fragColor, in vec2 fragCoord) 
{   
    fragColor = vec4(poltergeist(fragCoord, iGlobalTime)); 
}

কোনও রেজোলিউশন, কোনও টেক্সচার, যে কোনও ডিভাইসে (মোবাইল খুব) জিএল সমর্থন করে (যা কোনও পর্দার সাথে বেশ কিছু)।

এখনই এটি চলমান দেখুন!

https://www.shadertoy.com/view/ltB3zD

আপনি সহজেই স্ট্যান্ডার্ড ওপেনগল ব্যবহার করে আপনার জাভা প্রোগ্রামগুলিতে, বা কোনও স্ট্যান্ডার্ড ওয়েবজিএল ব্যবহার করে কোনও ব্রাউজারে এই শেডারটি অন্তর্ভুক্ত করতে পারেন।

কেবল মজাদার জন্য, আমি কোনও ডিভাইসে গুণমান এবং পারফরম্যান্সে পলটারজিস্টকে মারার জন্য কাউকে গন্টলেটটি ফেলে দিই। গোলমাল ভূতের নিয়ম! অপরাজিত!

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