চ্যালেঞ্জগুলিতে এলোমেলো প্রজন্ম নির্দিষ্ট করার উপায়


16

দ্রষ্টব্য : মেটাতে sensকমত্য অনুসারে , প্রশ্নগুলি এখানে বিষয়বস্তুতে রয়েছে।

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

কখনও কখনও এটি ঘটে যে আমি একটি চ্যালেঞ্জ পোস্ট করতে চাই যাতে এলোমেলোভাবে একটি ফু তৈরি করা জড়িত থাকে, যেখানে

  1. প্রদত্ত জিনিসটি একটি ফুও কিনা তা পরীক্ষা করা খুব সহজ এবং
  2. দ্রুত "ভাল মানের" র্যান্ডম ফু তৈরি করা কিছুটা শক্ত a

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

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

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

একটি অপ্রত্যাশিত এলোমেলো ফু জন্য একটি দুর্দান্ত সাধারণ সংজ্ঞা থাকতে পারে?

টি এল; ডিআর

কোনও "অপ্রত্যাশিত" এলোমেলোভাবে উত্পন্ন অবজেক্ট নির্দিষ্ট করার জন্য কি কোনও ভাল উপায় যা বিতরণ ঠিক করে না তবে হার্ড-কোডিংকে নিরুৎসাহিত করে?


মেটাতে র্যান্ডম করার জন্য আমাদের কাছে একটি স্ট্যান্ডার্ড সংজ্ঞা রয়েছে যা হার্ড-কোডিং নিষিদ্ধ করবে, তবে এটিকে পুরোপুরি অভিন্ন হিসাবে সীমাবদ্ধ রাখবে না।
জিওবিটস

5
দুর্দান্ত প্রশ্ন। আমি অতীতে খুঁজে পেয়েছি যে এলোমেলোতা নির্দিষ্ট করা শক্ত । বিশেষত আপনি যে দৃশ্যের বর্ণনা দিয়েছেন তার জন্যও এই সমস্যাটি রয়েছে যে আপনি কেবল এলোমেলো প্রার্থী তৈরি করতে পারেন এবং তারা যদি অবৈধ হয় তবে আবার করতে পারেন। এটি এমনকি আপনাকে অভিন্ন বিতরণ দেয়, তবে অ-বিবাদী রানটাইম। ইউনিফর্ম বিতরণ নির্দিষ্ট করার সময় সমস্যাটিও রয়েছে যে আসল সমাধানগুলি কখনই পুরোপুরি অভিন্ন হয় না । এটি একটি খুব সূক্ষ্ম সমস্যা। +1
মার্টিন এন্ডার

@ মার্টিনএেন্ডার রাইট, আমি সেই পদ্ধতিটি ভুলে গেছি। আমি এটিকে এবং অন্যান্য ধীর অ্যালগরিদমকে সময়সীমা সহ অস্বীকার করতে পারি, তবে তারা এখনও "একটি হার্ড-কোডেড ফু" সমাধানটি মঞ্জুরি দেয়।
Zgarb

দেখে মনে হচ্ছে আপনি K3 / K4 CPRNG উল্লেখ করতে পারে, বেশির ভাগ ভাষায় একটি লাইব্রেরি থাকবে en.wikipedia.org/wiki/Pseudorandom_number_generator
ইওয়ান

1
@ জগারব "জেনারেট এবং রিডো" অস্বীকার করার ক্ষেত্রে একটি বড় সমস্যা হ'ল ভাষার আরএনজি লাইব্রেরির বেশিরভাগ অংশই এটি করে।
নাথান মেরিল

উত্তর:


5

এক হাজার বিভিন্ন foos ফিরিয়ে দিন

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

জন্মদিনের প্যারাডক্স সম্পর্কে সচেতন থাকুন, নকলের সম্ভাবনা আপনার ভাবার চেয়ে বেশি হতে পারে। যদি কেবলমাত্র এক মিলিয়ন সম্ভব foos থাকে তবে এক হাজার এলোমেলো foo এর প্রায় 0.6 এর সম্ভাবনা থাকবে যে কোথাও কোথাও সেখানে একটি সদৃশ রয়েছে এবং এটি ধরে নিয়েছে যে foo জেনারেশন সম্পূর্ণ অভিন্ন। যদি এটি কোনও সমস্যা হতে পারে তবে প্রতি 1000 উত্পন্ন উত্পাদনের জন্য 900 টি অনন্য foos প্রয়োজন, যা খাঁটি foo জেনারেটরের পক্ষে অনেক বেশি উদার তবে হার্ডকোডিংয়ের জন্য এখনও অবৈধ।

এটি আপনাকে বারবার বোকার মতো জিনিস তৈরি করতে এবং বোকামি না পাওয়া পর্যন্ত নিখরচায়তা পরীক্ষা করতে দেয়। আমি মনে করি এটি নিজেই একটি বৈধ সমাধান, তবে আপনি যদি এটি পছন্দ না করেন:

তাড়াতাড়ি কর

পুরোপুরি এলোমেলো ফু-জাতীয় জিনিস ফু হওয়ার সম্ভাবনা সম্ভবত বেশ কম, সুতরাং একটি সময়সীমা নির্দিষ্টকরণ সম্ভবত ভু জেনারেশনে সত্যিকারের প্রচেষ্টা জোর করতে পারে।

বিভিন্ন ভাষার মধ্যে গতির পার্থক্য সামঞ্জস্য করতে, আপনি হ্যাকেররঙ্ক: https://www.hackerrank.com/en वातावरण মত ভাষার উপর নির্ভর করে বিভিন্ন সময়সীমা থাকতে পারেন । তবে আপনি যদি বড় পরিমাণে foos নির্দিষ্ট করেন তবে এলোমেলো foo- এর মতো জিনিসগুলির foo হওয়ার সম্ভাবনা সত্যিই কম হতে পারে, সুতরাং "মহাবিশ্বের তাপের মৃত্যুর আগে" নিয়ম যথেষ্ট হতে পারে।


আমি মনে করি আপনি এখানে কিছু আছে। "প্রোগ্রামটি এন সময়ে চালানো কমপক্ষে 90% সময়ের কোনও নকল তৈরি করবে না" এটি পরীক্ষার পক্ষে কংক্রিট এবং বেশ সহজ, এবং এটি নিষ্ঠুর সাথে জোর করে এবং সহজ প্রত্যাখ্যানের নমুনাও রোধ করতে বাধ্য সময়ের সাথে মিলিত হতে পারে।
জাগারব

2

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

কোনও সমাধান নয়: স্পষ্টভাবে হার্ড-কোডিংকে অস্বীকার করুন

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

হার্ড-কোডিংকে অদম্য করুন

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

আউটপুট প্যারামিটারাইজ করুন

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

রাখুন কিছু সম্ভাব্যতা বিতরণের উপর বাধানিষেধ

আপনি যদি পুরোপুরি সীমাহীন সম্ভাব্যতা বিতরণ ছেড়ে দিতে চান তবে আপনি এতে কিছুটা বাধা দিতে পারেন, যা উত্তরদাতাদের তাদের বিতরণ বাছাইয়ে অনেক স্বাধীনতা দেয় তবে যা হার্ড-কোডিংকে একটি কঠিন বা অসম্ভব বলে তোলে:

  • সবচেয়ে সহজ প্রতিবন্ধকতা যা মনে আসে তা হ'ল কোনও সম্ভাব্য আউটপুট নির্দিষ্ট প্রান্তিকের নীচে হওয়ার জন্য সর্বনিম্ন এবং সর্বাধিক সম্ভাবনার মধ্যে পার্থক্য প্রয়োজন। একটি হার্ড-কোডেড পদ্ধতির প্রায় সব আউটপুটগুলির জন্য প্রায় শূন্যের সম্ভাবনা এবং ডিফল্ট মানটির 1 এর কাছাকাছি সম্ভাবনা থাকে। আপনার যদি সর্বাধিক পার্থক্য 0.1 বলার নীচে প্রয়োজন হয় তবে পদ্ধতির বিকল্প হিসাবে তৈরি করতে 10 (এলোমেলোভাবে নির্বাচিত) ডিফল্ট মান হওয়া দরকার। একইভাবে আপনার কেবল প্রতিটি সম্ভাব্য আউটপুটটির জন্য ন্যূনতম সম্ভাবনাও প্রয়োজন হতে পারে, যেমন 1 / (2 * N *), যেখানে এন সম্ভাব্য আউটপুটগুলির সংখ্যা।
  • বিকল্পভাবে, আপনার প্রয়োজন হতে পারে যে বিতরণে কোনও (সম্ভাবনা) ফাঁক নেই, যাতে আকারের কোনও ব্যবধান নেই δ (আপনার দ্বারা নির্বাচিত) যেমন উচ্চ এবং নিম্ন উভয় সম্ভাবনা রয়েছে। এর অর্থ সম্ভাবনার দিক থেকে কোনও আউটলিয়ার থাকতে পারে না, যা সম্ভবত হার্ড-কোডিং পদ্ধতির মাধ্যমে উত্পন্ন হয়েছিল।

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

এই পদ্ধতির জন্য একটি সময়সীমাও প্রয়োজন হতে পারে, কারণ অ-ডিফল্ট মানগুলির সম্ভাবনা বাড়ানোর এক উপায় হ'ল ডিফল্ট মানটিতে ফিরে যাওয়ার আগে একাধিকবার এলোমেলো foo সন্ধান করার চেষ্টা করা।

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