এমন কোনও ফাংশন যা ম্যাথ.আরেন্ডমকে () শুদ্ধ বলে?


112

নিম্নলিখিতটি কি একটি খাঁটি ফাংশন?

function test(min,max) {
   return  Math.random() * (max - min) + min;
}

আমার বোধগম্যতা হল একটি খাঁটি ফাংশন এই শর্তগুলি অনুসরণ করে:

  1. এটি পরামিতিগুলি থেকে গণিত একটি মান প্রদান করে
  2. এটি রিটার্ন মান গণনা করা ছাড়া অন্য কোনও কাজ করে না

যদি এই সংজ্ঞাটি সঠিক হয় তবে আমার ফাংশনটি কি খাঁটি ফাংশন? বা একটি বিশুদ্ধ ফাংশন সংজ্ঞায়িত করা আমার বোঝা কি ভুল?


66
"এটি রিটার্ন মান গণনা করা ছাড়া অন্য কোনও কাজ করে না" তবে এটি কল করে Math.random()যা আরএনজির অবস্থার পরিবর্তন করে।
পল

1
দ্বিতীয় পয়েন্টটি আরও বেশি "যেমন এটি বাহ্যিক (ফাংশনটিতে) পরিবর্তন করে না" এর মতো; এবং প্রথমটিকে কিছুটা পরিপূরক করা উচিত "এটি একই পরামিতিগুলি থেকে গণনা করা একই মূল্যকে ফেরৎ দেয়" যেমন লোকেরা নীচে
লিখেছেন

এলোমেলোভাবে অনুমতি দেয় এমন একটি সেমিপুর ফাংশনটির ধারণা কি আছে? যেমন test(a,b)সর্বদা একই বস্তুটি ফেরত দেয় Random(a,b)(যা বিভিন্ন কংক্রিট সংখ্যার প্রতিনিধিত্ব করতে পারে)? যদি আপনি Randomপ্রতীকী রাখেন তবে এটি শাস্ত্রীয় অর্থে খাঁটি, যদি আপনি তাড়াতাড়ি মূল্যায়ন করেন এবং সংখ্যায় রাখেন, সম্ভবত এক ধরণের অপ্টিমাইজেশন হিসাবে, ফাংশনটি এখনও কিছু "বিশুদ্ধতা" বজায় রাখে।
জেডিএম

1
"যে কেউ এলোমেলো অঙ্ক তৈরির পাটিগণিত পদ্ধতি বিবেচনা করে সে অবশ্যই পাপের অবস্থায় রয়েছে।" - জন ভন নিউমান
স্টিভ কুও

1
@ জেডিএম আপনি যদি "অর্ধ-শুদ্ধ" এর থ্রেড অনুসরণ করেন, যেখানে আপনি খাঁটি মডুলোকে কিছু সু-সংজ্ঞায়িত পার্শ্ব-প্রতিক্রিয়া বিবেচনা করেন, আপনি মনাদ আবিষ্কার করতে পারেন। ডার্ক সাইড স্বাগত জানাই. > :)
লুকি

উত্তর:


185

না এইটা না. একই ইনপুট দেওয়া, এই ফাংশন বিভিন্ন মান প্রদান করবে। এবং তারপরে আপনি এমন কোনও 'টেবিল' তৈরি করতে পারবেন না যা ইনপুট এবং ফলাফলগুলি ম্যাপ করে।

খাঁটি ফাংশনের জন্য উইকিপিডিয়া নিবন্ধ থেকে :

ফাংশন সর্বদা একই আর্গুমেন্ট মান (গুলি) প্রদত্ত একই ফলাফলের মানটি মূল্যায়ন করে। ফাংশন ফলাফলের মান কোনও গোপন তথ্য বা অবস্থার উপর নির্ভর করতে পারে না যা প্রোগ্রামের নির্বাহের সময় বা প্রোগ্রামের বিভিন্ন নির্বাহের মধ্যে পরিবর্তিত হতে পারে বা এটি I / O ডিভাইসগুলির কোনও বাহ্যিক ইনপুটের উপর নির্ভর করতে পারে না

এছাড়াও, আরেকটি বিষয় হ'ল খাঁটি ফাংশনটি একটি টেবিলের সাথে প্রতিস্থাপন করা যেতে পারে যা এই থ্রেডে বর্ণিত হিসাবে ইনপুট এবং আউটপুট থেকে ম্যাপিং উপস্থাপন করে ।

আপনি যদি এই ফাংশনটি আবার লিখতে চান এবং এটি একটি শুদ্ধ ফাংশনে পরিবর্তন করতে চান তবে আপনার এলোমেলো হিসাবে এলোমেলো মানটিও পাস করা উচিত

function test(random, min, max) {
   return random * (max - min) + min;
}

এবং তারপরে এটিকে কল করুন (উদাহরণস্বরূপ, 2 এবং 5 মিনিট এবং সর্বাধিক হিসাবে):

test( Math.random(), 2, 5)

2
আপনি যদি কল করার আগে প্রতিটি বার ফাংশনের অভ্যন্তরে এলোমেলো জেনারেটরটি পুনরায় বীজ বপন করেন Math.random?
cs95

16
@ cᴏʟᴅsᴘᴇᴇᴅ তার পরেও এর পার্শ্ব-প্রতিক্রিয়া থাকবে (ভবিষ্যতের Math.randomআউটপুট পরিবর্তন করা ); এটি শুদ্ধ হওয়ার জন্য, আপনাকে কোনওভাবেই বর্তমান আরএনজি অবস্থা সংরক্ষণ করতে হবে, এটিকে আবার অনুসন্ধান করতে হবে, কল Math.randomকরতে হবে এবং এটি পূর্বের অবস্থায় ফিরিয়ে আনতে হবে।
LegionMammal978

2
@ cᴏʟᴅsᴘᴇᴇᴅ সমস্ত গণনা করা আরএনজি এলোমেলোভাবে জালিয়াতির চারপাশে ভিত্তি করে। নীচে এমন কিছু চলতে হবে যা এলোমেলোভাবে প্রদর্শিত হয় এবং আপনি একে অপরিষ্কার করে তার জন্য অ্যাকাউন্ট করতে পারবেন না। এছাড়াও, এবং সম্ভবত আপনার প্রশ্নের আরও গুরুত্বপূর্ণ, আপনি ম্যাথ.র্যান্ডম বীজ করতে পারবেন না
zfrisch

14
@ লিজিয়নম্যামাল978 ... এবং এটি পরমাণুভাবে করুন।
wchargin

2
@ cᴏʟᴅsᴘᴇᴇᴅ আরএনজি আছে এমন উপায় রয়েছে যা খাঁটি ফাংশন নিয়ে কাজ করে তবে এতে আরএনজি রাষ্ট্রটি ফাংশনে প্রেরণ করা এবং ফাংশনটি রিপ্লেসমেন্ট আরএনজি রাজ্যকে ফিরিয়ে নেওয়া জড়িত, যা হাস্কেল (কার্যকরী শুদ্ধি কার্যকর করার জন্য একটি কার্যকরী প্রোগ্রামিং ভাষা) অর্জন করে এটা।
ফারাপ

50

আপনার প্রশ্নের সহজ উত্তর হ'ল Math.random()নিয়ম # 2 লঙ্ঘন করে।

এখানে আরও অনেক উত্তর উল্লেখ করেছে যে উপস্থিতির Math.random()অর্থ এই ফাংশনটি খাঁটি নয়। তবে আমি মনে করি এটি কলঙ্কযুক্ত কেন এটি Math.random() কলঙ্কযুক্ত ফাংশন।

সমস্ত সিউডোরডম সংখ্যা জেনারেটরের মতো, Math.random()"বীজ" মান দিয়ে শুরু হয়। এটি তখন নিম্ন-স্তরের বিট ম্যানিপুলেশনগুলির শৃঙ্খলার জন্য বা অন্য ক্রিয়াকলাপের একটি অপ্রত্যাশিত (তবে সত্যিই এলোমেলো নয় ) আউটপুট তৈরির শুরুর জন্য সেই মানটিকে ব্যবহার করে ।

জাভাস্ক্রিপ্টে, জড়িত প্রক্রিয়াটি বাস্তবায়ন নির্ভর, এবং অন্যান্য অনেক ভাষার মতো, জাভাস্ক্রিপ্ট বীজ নির্বাচন করার কোনও উপায় সরবরাহ করে না :

বাস্তবায়ন এলোমেলো সংখ্যা জেনারেশন অ্যালগরিদমে প্রাথমিক বীজ নির্বাচন করে; এটি ব্যবহারকারী চয়ন বা পুনরায় সেট করতে পারবেন না।

এই কারণেই এই ফাংশনটি খাঁটি নয়: জাভাস্ক্রিপ্ট মূলত একটি অন্তর্নিহিত ফাংশন প্যারামিটার ব্যবহার করছে যা আপনার কোনও নিয়ন্ত্রণে নেই। এটি ডেটা থেকে প্যারামিটারটি অন্য কোথাও গণনা করা এবং সঞ্চয় করা পড়ছে, এবং তাই আপনার সংজ্ঞায় নিয়ম # 2 লঙ্ঘন করে।

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

এই ফাংশনের খাঁটি সংস্করণে তিনটি পরামিতি নেওয়া দরকার :

function test(min, max, seed) {
   return  seedable_random(seed) * (max - min) + min;
}

যে কোনও প্রদত্ত ট্রিপল (min, max, seed)প্যারামিটারের জন্য, এটি সর্বদা একই ফলাফলটি ফিরে আসবে।

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


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

2
পছন্দ করুন যদিও কেবল বাস্তবায়ন-নির্ভর মানটি পড়া বিশুদ্ধতা ভাঙার পক্ষে যথেষ্ট। উদাহরণস্বরূপ, পাইথন 3 হ্যাশগুলি প্রক্রিয়াগুলির মধ্যে স্থিতিশীল হয় না তা কখনই লক্ষ্য করুন?
প্রেরক

2
এই উত্তরটি কীভাবে পরিবর্তিত হবে যদি Math.randomএকটি পিআরএনজি ব্যবহার না করে পরিবর্তে একটি হার্ডওয়্যার আরএনজি ব্যবহার করে প্রয়োগ করা হয়? হার্ডওয়্যার আরএনজিটির সত্যিকার অর্থে স্বাভাবিক অর্থে রাজ্য নেই, তবে এটি এলোমেলো মান তৈরি করে (এবং এভাবে ইনপুট নির্বিশেষে ফাংশন আউটপুটটি এখনও আলাদা), তাই না?
mtraceur

@ মিটারেসর, এটি সঠিক। তবে আমি মনে করি না উত্তরটি আরও পাল্টে যাবে। আসলে, এই কারণেই আমি আমার উত্তরে "রাষ্ট্র" সম্পর্কে কথা বলতে সময় ব্যয় করি না। একটি হার্ডওয়্যার আরএনজি থেকে পড়া মানে "অন্য কোথাও গণনা করা এবং সংরক্ষণ করা ডেটা" থেকে পড়া reading এটি ঠিক যে ডেটা গণনা করা হয় এবং কম্পিউটারের নিজেই এটির পরিবেশের সাথে মিথস্ক্রিয় করার সাথে সাথে শারীরিক মাধ্যমের মধ্যে সংরক্ষণ করা হয়।
প্রেরক 18

1
এই একই যুক্তি এমনকি আরও পরিশীলিত র্যান্ডমাইজেশন স্কিমগুলিতে প্রযোজ্য, এমনকি র্যান্ডম.অর্গ এর বায়ুমণ্ডলীয় কোলাহলের মতো । +1
jpmc26

38

একটি খাঁটি ফাংশন এমন একটি ফাংশন যেখানে রিটার্ন মানটি পর্যবেক্ষণযোগ্য পার্শ্ব প্রতিক্রিয়া ছাড়াই কেবল তার ইনপুট মানগুলি দ্বারা নির্ধারিত হয়

ম্যাথআর্যান্ডম ব্যবহার করে আপনি এর মান নির্ধারণ করছেন ইনপুট মান ব্যতীত অন্য কিছু দ্বারা। এটি খাঁটি ফাংশন নয়।

উৎস


25

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

যদি কোনও ফাংশন খাঁটি হয় তবে একই ইনপুটগুলির সাথে একাধিক কল অপ্টিমাইজ করা নিরাপদ এবং কেবলমাত্র আগের কলটির ফলাফল পুনরায় ব্যবহার করা।

আমার জন্য পিএস কমপক্ষে এবং আরও অনেকের জন্য, রিডুএক্স শব্দটি খাঁটি ফাংশনকে জনপ্রিয় করে তুলেছে । সরলভাবে রিডেক্স ডক্স থেকে :

রিডিউসারের অভ্যন্তরে আপনার কখনই করা উচিত নয়:

  • এর যুক্তিগুলি পরিবর্তন করুন;

  • এপিআই কল এবং রাউটিং ট্রানজিশনের মতো পার্শ্ব প্রতিক্রিয়াগুলি সম্পাদন করুন;

  • অ-খাঁটি ফাংশনগুলি কল করুন, যেমন তারিখ.নো () বা ম্যাথ.র্যান্ডম ()।


3
যদিও অন্যরা দুর্দান্ত জবাব দিয়েছে, তবে আমি যখন আমার কাছে রেডুএক্স ডক নিয়ে এসেছিল তখন আমি নিজেকে প্রতিহত করতে পারি নি এবং ম্যাথ.রেন্ডম () এর মধ্যে সুনির্দিষ্টভাবে উল্লেখ করেছেন :)
শুভনিক সিংহ

20

গাণিতিক দৃষ্টিকোণ থেকে, আপনার স্বাক্ষর নয়

test: <number, number> -> <number>

কিন্তু

test: <environment, number, number> -> <environment, number>

যেখানে এর environmentফলাফল সরবরাহ করতে সক্ষম Math.random()। এবং প্রকৃতপক্ষে এলোমেলো মান উত্পন্ন করা পরিবেশকে পার্শ্ব প্রতিক্রিয়া হিসাবে রূপান্তরিত করে, তাই আপনিও একটি নতুন পরিবেশ ফিরিয়ে দেন, যা প্রথমটির সমান নয়!

অন্য কথায়, যদি আপনার কোনও ধরণের ইনপুট প্রয়োজন হয় যা প্রাথমিক যুক্তি ( <number, number>অংশ) থেকে আসে না , তবে আপনাকে মৃত্যুদন্ড পরিবেশ প্রদান করতে হবে (এটি উদাহরণস্বরূপ রাষ্ট্র সরবরাহ করে Math)। অন্যান্য উত্তর দ্বারা উল্লিখিত অন্যান্য জিনিসগুলিতে একই জিনিস প্রযোজ্য যেমন I / O বা এ জাতীয়।


সাদৃশ্য হিসাবে, আপনি লক্ষ্য করতে পারেন এটি কীভাবে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংকে উপস্থাপন করা যায় - যদি আমরা বলি, যেমন

SomeClass something
T result = something.foo(x, y)

তাহলে আসলে আমরা ব্যবহার করছি

foo: <something: SomeClass, x: Object, y: Object> -> <SomeClass, T>

যে উপাদানটির সাথে তার পদ্ধতিটি পরিবেশের অংশ হওয়ার অনুরোধ জানানো হয়। এবং SomeClassফলাফলের অংশটি কেন ? কারণ somethingরাষ্ট্রের অবস্থাও বদলে যেতে পারত!


7
সবচেয়ে খারাপটি হলেও, পরিবেশটিও পরিবর্তিত হয়েছে, তাই test: <environment, number, number> -> <environment, number>এটি হওয়া উচিত
বার্গি

1
আমি নিশ্চিত নই যে ওও উদাহরণটি খুব একই রকম। প্রকারের উপর ভিত্তি করে ওভারলোডড সংজ্ঞাগুলিকে প্রত্যাখ্যান করার a.F(b, c)জন্য F(a, b, c)একটি বিশেষ নিয়ম সহ সিনট্যাকটিক চিনির হিসাবে দেখা যেতে পারে (এটি আসলে পাইথন এটি উপস্থাপন করে কীভাবে)। তবে এখনও উভয় স্বীকৃতিতেই স্পষ্ট, অন্যদিকে খাঁটি-অ-কার্যকরী পরিবেশের উত্স কোডে কখনও উল্লেখ করা হয়নি। Faa
আইএমএসওপি

11

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

https://github.com/MostlyAdequate/mostly-adequate-guide/blob/master/ch3.md


10

অন্যান্য উত্তরগুলির পাশাপাশি যা সঠিকভাবে নির্দেশ করে যে এই ফাংশনটি কীভাবে অ-সংঘবদ্ধ, এটির একটি পার্শ্ব-প্রতিক্রিয়াও রয়েছে: এটি ভবিষ্যতের কলগুলিকে math.random()আলাদা উত্তর ফেরত দেবে to এবং এলোমেলো-সংখ্যার জেনারেটর যার কাছে সেই সম্পত্তি নেই এটি সাধারণত কোনও ধরণের I / O সঞ্চালন করে, যেমন ওএস দ্বারা সরবরাহিত এলোমেলো ডিভাইস থেকে পড়া। হয় খাঁটি ফাংশনের জন্য ভার্বোটেন।


7

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

function test(min, max, generator) {
  return  generator() * (max - min) + min;
}

এখন, আপনি জেনারেটরকে উপহাস করতে পারেন এবং আপনার কোডটি সঠিকভাবে পরীক্ষা করতে পারেন:

const result = test(1, 2, () => 3);
result == 4 //always true

এবং আপনার "উত্পাদন" কোডে:

const result = test(1, 2, Math.random);

1
Test পরীক্ষার জন্য আপনার চিন্তার জন্য। অল্প যত্নের সাথে আপনি কোনও গ্রহণের সময় পুনরাবৃত্তিমূলক পরীক্ষাও util.Randomকরতে পারেন, যা আপনি পরীক্ষার শুরুতে পুরানো আচরণের পুনরাবৃত্তি করতে বা নতুন (তবে পুনরাবৃত্তযোগ্য) রানের জন্য বীজ বানাতে পারেন। যদি মাল্টি-থ্রেডিং হয়, আপনি মূল থ্রেডে এটি করতে সক্ষম হতে পারবেন এবং Randomপুনরাবৃত্তযোগ্য থ্রেড-স্থানীয় Randomগুলি বুনতে পারেন । যাইহোক, আমি এটি বুঝতে test(int,int,Random)পেরে, এটি খাঁটি হিসাবে বিবেচিত হয় না কারণ এটি এর অবস্থার পরিবর্তন করে Random
পিজেট্রাইল 21

2

আপনি নিম্নলিখিত সঙ্গে ভাল হতে হবে:

return ("" + test(0,1)) + test(0,1);

সমান হতে

var temp = test(0, 1);
return ("" + temp) + temp;

?

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

এটির সাথে আমার ব্যবহারিক অভিজ্ঞতা আছে। এসকিউএল সার্ভারের অনুমতি দেওয়া হয়েছে getdate()এবং newid()"খাঁটি" ফাংশনে এবং অপ্টিমাইজারটি ইচ্ছামত কলগুলি কেটে নেবে। কখনও কখনও এটি বোবা কিছু করতে হবে।

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