অবিচ্ছিন্ন স্থানীয় ভেরিয়েবল কি দ্রুততম এলোমেলো সংখ্যা জেনারেটর?


329

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

void updateEffect(){
    for(int i=0;i<1000;i++){
        int r;
        int g;
        int b;
        star[i].setColor(r%255,g%255,b%255);
        bool isVisible;
        star[i].setVisible(isVisible);
    }
}

এটা কি যে চেয়ে দ্রুত

void updateEffect(){
    for(int i=0;i<1000;i++){
        star[i].setColor(rand()%255,rand()%255,rand()%255);
        star[i].setVisible(rand()%2==0?true:false);
    }
}

এবং অন্যান্য এলোমেলো নম্বর জেনারেটরের তুলনায় দ্রুত?


88
+1 এটি পুরোপুরি বৈধ প্রশ্ন। এটি সত্য যে অনুশীলনে, অবিচ্ছিন্ন মানগুলি এলোমেলো হতে পারে। তারা বিশেষত নয় এবং এটি ইউবি যে খারাপ জিজ্ঞাসা করে না তা এই সত্য ।
imallett

35
@ মিমলেট: একেবারে। এটি একটি ভাল প্রশ্ন এবং অতীতে অন্তত একটি পুরাতন জেড 80 (অ্যামস্ট্রাদ / জেডএক্স স্পেকট্রাম) গেমটি তার ভূখণ্ডটি সেট আপ করার জন্য ডেটা হিসাবে এটির প্রোগ্রামটিকে ব্যবহার করেছিল । এমনকি এর নজিরও রয়েছে। আজকাল তা করতে পারি না। আধুনিক অপারেটিং সিস্টেমগুলি সমস্ত মজা দূরে নিয়ে যায়।
বাথশেবা

81
অবশ্যই মূল সমস্যাটি এলোমেলো নয়।
জন

30
প্রকৃতপক্ষে, একটি অবিচ্ছিন্ন ভেরিয়েবলের একটি এলোমেলো মান হিসাবে ব্যবহৃত হচ্ছে এর একটি উদাহরণ রয়েছে, দেখুন দেবিয়ান আরএনজি বিপর্যয় ( এই নিবন্ধের উদাহরণ 4 )।
পেপারবার্ডমাস্টার

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

উত্তর:


299

অন্যরা যেমন উল্লেখ করেছে, এটি হ'ল অপরিবর্তিত আচরণ (ইউবি)।

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

দুটি প্রধান সমস্যা যদিও:

  1. এটি বিশেষ এলোমেলো হবে না। এই ক্ষেত্রে, আপনি স্ট্যাক থেকে পড়ছেন, সুতরাং আগে যা ছিল তা আপনি পাবেন। যা কার্যকরভাবে এলোমেলো, সম্পূর্ণ কাঠামোগত, আপনি যে পাসওয়ার্ডটি দশ মিনিট আগে প্রবেশ করেছিলেন বা আপনার দাদির কুকির রেসিপি হতে পারে।

  2. এটি খারাপ (মূলধন 'বি') অনুশীলন করে এই জাতীয় জিনিসটিকে আপনার কোডে প্রবেশ করতে দেয়। প্রযুক্তিগতভাবে, কম্পাইলারটি reformat_hdd();প্রতিবার আপনি একটি অপরিজ্ঞাত ভেরিয়েবল পড়তে inোকাতে পারে। এটি হবে না , তবে আপনার এটি কোনওভাবেই করা উচিত নয়। অনিরাপদ কাজ করবেন না। কম ব্যতিক্রম আপনার করা, নিরাপদ আপনি আপতিক ভুল থেকে হয় সব সময়।

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

এছাড়াও, আমি আপনাকে গুলি করতাম।


39
@ পোটাটোসওয়টার: ইটানিয়াম রেজিস্টারে নাটি (একটি জিনিস নয়) থাকতে পারে যা কার্যত একটি "অবিচ্ছিন্ন রেজিস্টার"। ইটানিয়ামে, আপনি যখন কোনও রেজিস্টার লিখেছেন না তখন সেগুলি পড়লে আপনার প্রোগ্রামটি বাতিল হয়ে যেতে পারে (এটিতে আরও পড়ুন এখানে: ব্লগস.এমএসএনএন / বি / ওল্ডনেউথিং / অর্কিভ / ২০০৪ / ০১ / ১৯ / ১০ / .০১1.aspx )। সুতরাং একচেটিয়া কারণগুলি কেন অবিচ্ছিন্ন মানগুলি পড়া অপরিবর্তিত আচরণ is ইটানিয়াম খুব বেশি জনপ্রিয় না হওয়ার এটিও সম্ভবত একটি কারণ :)
টিবলার

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

25
এছাড়াও, আমি আপনাকে বরখাস্ত করেছিলাম বলার চেয়ে বরং নির্বোধ বিষয় বলে মনে করি, ভাল অনুশীলনগুলি কোড কোড পর্যালোচনায় ধরা উচিত, আলোচনা করা উচিত এবং এটি আর কখনও ঘটবে না। এটি অবশ্যই ধরা উচিত যেহেতু আমরা সঠিক সতর্কতা পতাকা ব্যবহার করছি, তাই না?
শফিক ইয়াঘমোর

17
@ মিশেল আসলে, এটা। যদি কোনও প্রোগ্রামের কোনও পর্যায়ে অপরিবর্তিত আচরণ থাকে, সংকলক আপনার প্রোগ্রামটিকে এমনভাবে অনুকূলিত করতে পারে যা সংজ্ঞায়িত আচরণকে অগ্রাহ্য করার আগে কোডটিকে প্রভাবিত করে। এটি যেভাবে মনকে জঘন্য করে তুলতে পারে তার বিভিন্ন নিবন্ধ এবং বিক্ষোভ রয়েছে যেগুলি এখানে বেশ ভাল একটি রয়েছে: ব্লগস.এমএসএনএন / বি / সোডেনউইথিং / আর্কাইভ / 2014 / 06 / 27 / 10537746.aspx (যা স্ট্যান্ডার্ডের কিছুটা অন্তর্ভুক্ত করে যা বলে আপনার প্রোগ্রামের কোনও পথ যদি ইউবির কাছে ডাকে) সমস্ত বেট বন্ধ রয়েছে
টম ট্যানার

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

213

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

সংকলকগণ অপরিজ্ঞাত আচরণের আশেপাশে অনুকূলিতকরণ নিয়ে অত্যন্ত আগ্রাসী হয়ে পড়েছে এবং আমরা অনেকগুলি ক্ষেত্রেই আবিষ্কার করতে পারি যেখানে অপরিজ্ঞাত আচরণটি সুরক্ষা ত্রুটির দিকে পরিচালিত করে। সবচেয়ে কুখ্যাত কেসটি সম্ভবত লিনাক্স কার্নেল নাল পয়েন্টার চেক অপসারণ যা আমি আমার উত্তরটিতে সি ++ সংকলন বাগের উল্লেখ করেছি? যেখানে অপরিজ্ঞাপিত আচরণের চারপাশে একটি সংকলক অপ্টিমাইজেশন সীমাবদ্ধ লুপটিকে অসীম রূপান্তরিত করে।

আমরা সিইআরটি-র বিপজ্জনক অপটিমাইজেশন এবং লোকসানহানির কারণ ( ভিডিও ) পড়তে পারি যা বলে যে, অন্যান্য জিনিসগুলির মধ্যে:

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

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

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

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

আমি যেখানে এমন ঘটনা ঘটে তার কোনও উদাহরণ জানি না তবে এই মুহুর্তে আমরা এটিকে বাতিল করতে পারি না।

বাস্তব উদাহরণ, আপনি প্রত্যাশিত ফলাফল নয়

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

void updateEffect(int  arr[20]){
    for(int i=0;i<20;i++){
        int r ;    
        arr[i] = r ;
    }
}

ঝনঝন এটি অপ্টিমাইজ করে ( এটি সরাসরি দেখুন ):

updateEffect(int*):                     # @updateEffect(int*)
    retq

বা সম্ভবত সমস্ত জিরো পান, এই পরিবর্তিত কেসের মতো:

void updateEffect(int  arr[20]){
    for(int i=0;i<20;i++){
        int r ;    
        arr[i] = r%255 ;
    }
}

এটি সরাসরি দেখুন :

updateEffect(int*):                     # @updateEffect(int*)
    xorps   %xmm0, %xmm0
    movups  %xmm0, 64(%rdi)
    movups  %xmm0, 48(%rdi)
    movups  %xmm0, 32(%rdi)
    movups  %xmm0, 16(%rdi)
    movups  %xmm0, (%rdi)
    retq

এই উভয় ক্ষেত্রেই নিখুঁত আচরণের পুরোপুরি গ্রহণযোগ্য ফর্ম।

দ্রষ্টব্য, আমরা যদি কোনও ইটানিয়ামে থাকি তবে আমরা একটি ফাঁদ মান দিয়ে শেষ করতে পারি :

[...] যদি নিবন্ধক একটি বিশেষ-মান-মান রাখে, কয়েকটি নির্দেশনা বাদে নিবন্ধের ফাঁদগুলি পড়ুন [...]

অন্যান্য গুরুত্বপূর্ণ নোট

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

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

যেমন ম্যাথিউ এম। উল্লেখ করেছেন যে প্রতিটি সি প্রোগ্রামার অপরিজ্ঞাত আচরণ # 2/3 সম্পর্কে কী জেনে রাখা উচিত তাও এই প্রশ্নের সাথে প্রাসঙ্গিক। এটি অন্যান্য বিষয়গুলির মধ্যে বলে ( জোর দেওয়া খনি ):

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

আমার কাছে এটি গভীরভাবে অসন্তুষ্টিজনক, আংশিক কারণ সংকলক অবশ্যম্ভাবীভাবে দোষারোপ করা শেষ করে, তবে এর কারণ এটিও হ'ল সি কোডের বিশাল মৃতদেহগুলি কেবল বিস্ফোরণের অপেক্ষায় স্থল খনি mines

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


1
সংকলক আউটপুট উদাহরণগুলির জন্য + (ইনট) (পিআই / 3); একটি বাস্তব জীবনের উদাহরণ যা ইউবি, ভাল, ইউবি

2
ইউবি কার্যকরভাবে কার্যকরভাবে একটি দুর্দান্ত হ্যাকারের ট্রেডমার্ক হিসাবে ব্যবহৃত হত। এই traditionতিহ্য সম্ভবত 50 বছর বা তারও বেশি সময় ধরে চলেছে। দুর্ভাগ্যক্রমে, খারাপ লোকের কারণে কম্পিউটারগুলিকে এখন ইউবির প্রভাব হ্রাস করতে হবে। আমি 90s এর দশকে, যখন ওএস তাদের নিজের থেকে ব্যবহারকারীকে রক্ষা করতে সক্ষম ছিল না তখন আমি 90 এর দশকের, ইউবি মেশিন কোড বা পোর্ট রিড / রাইটিং দিয়ে কীভাবে শীতল জিনিসগুলি করতে পারি তা সত্যই উপভোগ করেছি।
sfdcfox

1
@sfdcfox যদি আপনি এটি মেশিন কোড / এসেম্বলারের মধ্যে করছিলেন তবে এটি পূর্বনির্ধারিত আচরণ ছিল না (এটি প্রচলিত আচরণ হতে পারে)।
কালেথ

2
যদি আপনার মনে একটি নির্দিষ্ট সমাবেশ থাকে, তবে এটি ব্যবহার করুন এবং অসম্পূর্ণ সি না লিখুন everyone তারপরে প্রত্যেকেই জানতে পারবেন আপনি একটি নির্দিষ্ট অ-বহনযোগ্য কৌশল ব্যবহার করছেন। এবং এটি খারাপ লোক নয় যার অর্থ আপনি ইউবি ব্যবহার করতে পারবেন না, এটি ইন্টেল ইত্যাদি তাদের চিপ চিপগুলিতে করছে।
কালেথ

2
@ 500-InternalServerError কারণ তারা সহজেই সনাক্তযোগ্য হতে পারে না বা সাধারণ ক্ষেত্রে এটি সনাক্তযোগ্যও নাও হতে পারে এবং তাই এগুলি অস্বীকার করার কোনও উপায় নেই be যা ব্যাকরণ লঙ্ঘন করে তা সনাক্ত করা যায়। আমাদেরও দুর্গঠিত এবং দুর্গন্ধযুক্ত কোনও ডায়গনিস্টিকের প্রয়োজন নেই যা সাধারণত তাত্ত্বিকভাবে কার্যকরভাবে সনাক্ত করা যায়নি এমন তাত্ত্বিকভাবে সনাক্ত করা যায় নি এমন তাত্পর্যপূর্ণ প্রোগ্রামগুলিকে আলাদা করে দেয় যা তাত্ত্বিকভাবে সনাক্ত করা যায়নি।
শফিক ইয়াঘমোর

164

না, এটা ভয়ানক।

অবিচ্ছিন্ন ভেরিয়েবল ব্যবহারের আচরণটি সি এবং সি ++ উভয় ক্ষেত্রেই সংজ্ঞায়িত এবং এ জাতীয় স্কিমের কাঙ্ক্ষিত পরিসংখ্যানগত বৈশিষ্ট্য খুব সম্ভবত নয়।

আপনি যদি একটি "দ্রুত এবং নোংরা" এলোমেলো নম্বর জেনারেটর চান তবে rand()আপনার সেরা বাজি is এর বাস্তবায়নে, এটি যা করে তা হ'ল একটি গুণ, সংযোজন এবং একটি মডুলাস।

আমার জানা সবচেয়ে দ্রুত জেনারেটরের জন্য আপনাকে uint32_tসিউডো-এলোমেলো ভেরিয়েবলের ধরণ হিসাবে ব্যবহার করতে হবে Iএবং ব্যবহার করতে হবে

I = 1664525 * I + 1013904223

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


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

24
@ জয় দ্রুত এবং নোংরা জন্য এককীকরণশীল ভেরিয়েবলের তুলনায়? এটি একটি আরও ভাল সমাধান।
মাইক ম্যাকমাহন

2
rand()উদ্দেশ্যটির জন্য উপযুক্ত নয় এবং আমার মতে এটি পুরোপুরি হ্রাস করা উচিত। এই দিনগুলিতে আপনি নিখরচায় লাইসেন্সযুক্ত এবং বিস্তৃততর এলোমেলো সংখ্যার জেনারেটর (উদাঃ মার্সেন টুইস্টার) ডাউনলোড করতে পারেন যা খুব সহজেই সবচেয়ে দ্রুততার সাথে দ্রুত তাই অত্যন্ত ত্রুটিযুক্ত ব্যবহার চালিয়ে যাওয়ার দরকার নেইrand()
জ্যাক এইডলি

1
র্যান্ড () এর আরও একটি ভয়াবহ সমস্যা রয়েছে: এটি এক ধরণের লক ব্যবহার করে, এটি থ্রেডের অভ্যন্তরে বলা হয় এটি আপনার কোডটি নাটকীয়ভাবে কমিয়ে দেয়। কমপক্ষে, একটি প্রবর্তক সংস্করণ আছে। এবং যদি আপনি সি ++ 11 ব্যবহার করেন তবে এলোমেলো এপিআই আপনার প্রয়োজনীয় সমস্ত সরবরাহ করে।
মারওয়ান বুরেলে

4
ন্যায্য বলতে তিনি জিজ্ঞাসা করেননি এটি একটি ভাল র্যান্ডম নম্বর জেনারেটর কিনা was তিনি জিজ্ঞাসা করলেন এটি দ্রুত ছিল কিনা? ঠিক আছে, হ্যাঁ, এটি সম্ভবত উপবাস করা হয়েছে।, তবে ফলাফলগুলি খুব এলোমেলো হবে না।
jcoder

42

ভাল প্রশ্ন!

অপরিবর্তিত মানে এলোমেলো নয়। এটি সম্পর্কে চিন্তা করুন, আপনি বিশ্বব্যাপী অবিচ্ছিন্ন ভেরিয়েবলগুলিতে যে মানগুলি পেতে চান তা সিস্টেম বা আপনার / অন্যান্য অ্যাপ্লিকেশনগুলির দ্বারা চালিত হয়েছিল। আপনার সিস্টেম আর মেমোরি ব্যবহার না করে এবং / অথবা সিস্টেম এবং অ্যাপ্লিকেশনগুলি কী ধরণের মান উত্পন্ন করে তার সাথে নির্ভর করে আপনি পেতে পারেন:

  1. সবসময় একই.
  2. মানগুলির একটি ছোট সেট হয়ে উঠুন।
  3. এক বা একাধিক ছোট ব্যাপ্তিতে মানগুলি পান।
  4. 16/32/64-বিট সিস্টেমে পয়েন্টার থেকে 2/4/8 দ্বারা বিভাজ্য অনেক মানগুলি দেখুন
  5. ...

আপনি যে মানগুলি পাবেন তা সম্পূর্ণরূপে নির্ভর করে যে কোন সিস্টেম এবং / বা অ্যাপ্লিকেশনগুলির দ্বারা নন-এলোমেলো মানগুলি রেখে যায়। সুতরাং, প্রকৃতপক্ষে কিছু শব্দ হবে (যদি না আপনার সিস্টেমটি আর স্মৃতি ব্যবহার না করে) তবে আপনি যে মান পুলটি আঁকবেন তা কোনওভাবেই এলোমেলো হতে পারে না।

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

এলোমেলোতা সম্পর্কে পড়ুন । আপনি দেখতে পাবেন যে এলোমেলোভাবে সম্পত্তি পাওয়া খুব নির্দিষ্ট এবং শক্ত। এটি ভাবা একটি সাধারণ ভুল যে আপনি যদি ট্র্যাক করা ঠিক এমন কিছু নেন তবে (আপনার পরামর্শ মত) আপনি এলোমেলো মান পাবেন।


7
... এবং এটি সমস্ত সংকলক-অপটিমাইজেশন বাদ দিচ্ছে যা এই কোডটিকে পুরোপুরি অন্তরে ফেলবে।
হস্তান্তরকারী

6 ... আপনি ডিবাগ এবং প্রকাশে আলাদা "এলোমেলোতা" পাবেন। অপরিজ্ঞাত অর্থ আপনি এটি ভুল করছেন।
এসকিএল সার্ফার

ঠিক। আমি সংক্ষিপ্ত বা সংক্ষিপ্ত করতে চাই "অপরিজ্ঞাত"! = "নির্বিচারে"! = "এলোমেলো" সাথে। এই ধরণের "অজানা" এর বিভিন্ন বৈশিষ্ট্য রয়েছে।
fche

গ্লোবাল ভেরিয়েবলগুলির একটি সংজ্ঞায়িত মান থাকার গ্যারান্টি দেওয়া হয়, তা স্পষ্টভাবে আরম্ভ করা হোক বা না হোক। এই হ 'ল সি ++ সত্য এবং সি পাশাপাশি
ব্রায়ান ভ্যান্ডেনবার্গ

32

অনেক ভাল উত্তর, তবে আমাকে আরেকটি যুক্ত করার অনুমতি দিন এবং এই পয়েন্টটিতে চাপ দিন যে একটি ডিস্ট্রিমেন্টিক কম্পিউটারে কোনও কিছুই এলোমেলো নয়। এটি সিউডো-আরএনজি দ্বারা উত্পাদিত সংখ্যা এবং স্ট্যাকের সি / সি ++ স্থানীয় ভেরিয়েবলের জন্য সংরক্ষিত মেমরির ক্ষেত্রে পাওয়া যায় এমন "এলোমেলো" সংখ্যার জন্য সত্য for

কিন্তু ... একটি গুরুত্বপূর্ণ পার্থক্য আছে।

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

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

#include <stdio.h>

notrandom()
{
        int r, g, b;

        printf("R=%d, G=%d, B=%d", r&255, g&255, b&255);
}

int main(int argc, char *argv[])
{
        int i;
        for (i = 0; i < 10; i++)
        {
                notrandom();
                printf("\n");
        }

        return 0;
}

আমি যখন এই কোডটি একটি লিনাক্স মেশিনে জিসিসির সাথে সংকলন করি এবং চালিত করি, তখন এটি অপ্রয়োজনীয়ভাবে নির্বিচারে পরিণত হয়:

R=0, G=19, B=0
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255

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

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

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


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

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

29

অপরিজ্ঞাত আচরণের অর্থ হ'ল সংকলকগুলির লেখকরা সমস্যাটি উপেক্ষা করতে মুক্ত কারণ প্রোগ্রামাররা কখনও যা ঘটবে তা অভিযোগ করার অধিকার রাখে না।

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

এর অর্থ এটিও হ'ল প্রায়শই সামগ্রীটি "অদ্ভুত" তবে স্থির বা কিছুটা এলোমেলো বা পরিবর্তনশীল তবে একটি স্পষ্ট স্পষ্ট প্যাটার্ন সহ (যেমন প্রতিটি পুনরাবৃত্তিতে ক্রমবর্ধমান মান)।

নিশ্চিতভাবেই আপনি এটি একটি শালীন এলোমেলো জেনারেটর হিসাবে আশা করতে পারবেন না


28

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

একটি ভাল অনুকূলকরণ সংকলক নেওয়া উচিত

void updateEffect(){
    for(int i=0;i<1000;i++){
        int r;
        int g;
        int b;
        star[i].setColor(r%255,g%255,b%255);
        bool isVisible;
        star[i].setVisible(isVisible);
    }
}

এবং এটি একটি নূপুরে সংকলন করুন। এটি অবশ্যই কোনও বিকল্পের চেয়ে দ্রুত faster এর খারাপ দিক রয়েছে যে এটি কিছু করবে না, তবে এটি অপরিবর্তিত আচরণের ক্ষয়ক্ষতি।


3
একটি সংকলকটির উদ্দেশ্য প্রোগ্রামাররা ডোমেনের প্রয়োজনীয়তাগুলি পূরণ করে এমন এক্সিকিউটেবল ফাইল তৈরি করতে সহায়তা করে কিনা বা উদ্দেশ্যটি সর্বাধিক "দক্ষ" এক্সিকিউটেবল উত্পাদন করা, যার আচরণ সি স্ট্যান্ডার্ডের ন্যূনতম প্রয়োজনীয়তার সাথে সামঞ্জস্যপূর্ণ হবে তা নির্ভর করে lot এই ধরনের আচরণটি কোনও কার্যকর উদ্দেশ্যকে পরিবেশন করবে কিনা তা বিবেচনা করে। পূর্ববর্তী উদ্দেশ্য সম্পর্কে, কোড থাকা r, g, b এর জন্য কিছু স্বেচ্ছাসেবী প্রাথমিক মান ব্যবহার করা বা ব্যবহারিক ক্ষেত্রে ডিবাগার ট্র্যাপ ট্রিগার করা কোডকে ন্যাপে পরিণত করার চেয়ে বেশি কার্যকর useful পরবর্তী উদ্দেশ্য সম্পর্কে ...
সুপারক্যাট

2
... একটি অনুকূল সংকলকটি নিম্নলিখিত ইনপুটগুলি কার্যকর করার জন্য কী ইনপুটগুলি সৃষ্টি করবে তা নির্ধারণ করতে হবে এবং এমন কোডগুলি অপসারণ করা উচিত যা কেবলমাত্র এ জাতীয় ইনপুট প্রাপ্ত হলে প্রাসঙ্গিক হবে।
সুপারক্যাট

1
@ সুপের্যাট বা এর উদ্দেশ্য সি হতে পারে স্ট্যান্ডার্ডের সাথে সম্মতিতে কার্যকর এক্সিকিউটেবল উত্পাদন করা যখন প্রোগ্রামারকে এমন জায়গাগুলি সন্ধানে সহায়তা করে যেখানে সম্মতি কার্যকর নাও হতে পারে। কম্পাইলাররা স্ট্যান্ডার্ডের প্রয়োজনের চেয়ে বেশি ডায়াগনস্টিকগুলি, যেমন জিসিসির মতো নির্গমন করে এই আপোস উদ্দেশ্যটি পূরণ করতে পারে -Wall -Wextra
দামিয়ান ইয়ারিক

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

@ দেবিমারগান - যেহেতু ডাকা ফাংশনগুলি "এই প্যারামিটারটি সেট করুন" টাইপের হয়, সেহেতু ইনপুটটি প্যারামিটারের বর্তমান মান হিসাবে সমান হয় তবে এটি প্রায় নিশ্চিতভাবেই হ্রাস পায়, যা সংকলকটি ধরে নিতে পারে নিখরচায় এটি ক্ষেত্রে হয়।
জুলু

18

এখনও উল্লেখ করা হয়নি, তবে সংজ্ঞায়িতকারী যা চাইবে না এমন কোড পাথগুলি যা সংজ্ঞায়িত আচরণের প্ররোচনা দেয়

void updateEffect(){}

যা অবশ্যই আপনার সঠিক লুপের চেয়ে দ্রুত এবং ইউবির কারণে পুরোপুরি উপযুক্ত।


18

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


13

আপনার নির্দিষ্ট কোড উদাহরণটি সম্ভবত আপনি প্রত্যাশা করছেন না do প্রযুক্তিগতভাবে লুপের প্রতিটি পুনরাবৃত্তিটি r, g এবং b মানগুলির জন্য স্থানীয় ভেরিয়েবলগুলি পুনরায় তৈরি করে, বাস্তবে এটি স্ট্যাকের ঠিক একই মেমরির স্থান। সুতরাং এটি প্রতিটি পুনরাবৃত্তির সাথে পুনরায় এলোমেলোভাবে পরিণত হবে না এবং r, g, এবং b পৃথকভাবে এবং প্রাথমিকভাবে কতটা এলোমেলোভাবে নির্বিশেষে আপনি 1000 টি বর্ণের জন্য একই 3 টি মান নির্ধারণ করবেন।

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


12

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


1
খুব ভাল পয়েন্ট! এটি একটি বাস্তববাদী কৌশল হতে পারে, তবে প্রকৃতপক্ষে এটির জন্য ভাগ্যের প্রয়োজন।
অর্থ-বিষয়গুলি

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

অ্যাপ্লিকেশন স্ট্যাক থেকে পৃথক ব্যবস্থাপূর্ণ হ্যান্ডলিং স্ট্যাক সহ কোনও অপারেটিং সিস্টেমের অভাবে, ভাগ্য ভালভাবে জড়িত হতে পারে, যেহেতু বিঘ্নগুলি প্রায়শই বর্তমান স্ট্যাকের সামগ্রীর বাইরে কিছুটা মেমরির বিষয়বস্তুগুলিকে বিরক্ত করে।
সুপারক্যাট

12

সত্যিই খারাপ! বদ অভ্যাস, খারাপ ফল। বিবেচনা:

A_Function_that_use_a_lot_the_Stack();
updateEffect();

যদি ফাংশন A_Function_that_use_a_lot_the_Stack() সর্বদা একই সূচনা করে তবে এটি একই ডেটা দিয়ে স্ট্যাকটি ছেড়ে দেয়। সেই ডেটা হ'ল আমরা কল করি updateEffect(): সর্বদা একই মান!


11

আমি একটি খুব সাধারণ পরীক্ষা করেছিলাম, এবং এটি মোটেও এলোমেলো ছিল না।

#include <stdio.h>

int main() {

    int a;
    printf("%d\n", a);
    return 0;
}

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


ভাল যুক্তি. কোডটিতে এই "এলোমেলো" নম্বর জেনারেটরটি কোথায় ডাকা হয় তার উপর ফলাফল দৃ strongly়ভাবে নির্ভর করে। এটি এলোমেলো থেকে বরং অনাকাঙ্ক্ষিত।
NO_NAME

10

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


7

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

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

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


2
"যদি কোনও বাইটের সংমিশ্রণটি বিশেষভাবে উদ্বেগজনক হয় তবে এটি পড়লে সর্বদা বাইটের সেই ধরণটি পাওয়া যায়" - যতক্ষণ না আপনি সেই প্যাটার্নটি মোকাবেলা করার জন্য কোড করেন, যে মুহুর্তে এটি আর ঘৃণ্য নয় এবং ভবিষ্যতে অন্যরকম প্যাটার্ন পড়া হবে।
স্টিভ জেসোপ

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

5

অন্যরা যেমন বলেছে, এটি দ্রুত হবে তবে এলোমেলো নয়।

সর্বাধিক সংকলক স্থানীয় ভেরিয়েবলগুলির জন্য যা করবেন তা হ'ল স্ট্যাকের জন্য তাদের জন্য কিছু জায়গা দখল করা, তবে এটি কোনও কিছুর সাথে সেট করা বিরক্ত করবেন না (স্ট্যান্ডার্ডটি বলে যে তাদের প্রয়োজন নেই, তাই আপনি যে কোডটি উত্পন্ন করছেন তা ধীরে ধীরে কেন করবেন?)।

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

গুরুত্বপূর্ণ উদাহরণস্বরূপ এটি ব্যবহারের চেষ্টা করার জন্য আপনার উদাহরণের জন্য, এই মানগুলি আপনি যখন একবার পড়বেন ততবার পরিবর্তন হবে না, প্রতিবার সেগুলি একই হবে। সুতরাং আপনি একই রঙ এবং দৃশ্যমানতার জন্য সেট করা একটি 100 তারা পাবেন।

এছাড়াও, কিছুই বলে না যে সংকলকটি এই মানটি আরম্ভ করা উচিত নয় - যাতে ভবিষ্যতের সংকলক এটি করতে পারে।

সাধারণভাবে: খারাপ ধারণা, এটি করবেন না। (অনেক "চালাক" কোড স্তরের অপ্টিমাইজেশনের মতো সত্যই ...)


2
আপনি কী হবে তার বিষয়ে কিছু দৃ strong় ভবিষ্যদ্বাণী করছেন যদিও এর কোনওটিই ইউবির কারণে গ্যারান্টিযুক্ত নয়। এটি বাস্তবেও সত্য নয়।
usr ডিরেক্টরির

3

অন্যরা যেমন ইতিমধ্যে উল্লেখ করেছে, এটি অপরিজ্ঞাত আচরণ ( ইউবি ), তবে এটি "কাজ" করতে পারে।

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

এখানে আরও একটি অনুরূপ ইউবি সম্পর্কে প্রশ্ন রয়েছে। এই ইউবি সম্পর্কে না জেনে নিজেকে এইভাবে বাগ খোঁজার চেষ্টা করে দেখুন। আপনি সি / সি এ ধরনের অদ্ভুত জিনিষ সম্পর্কে আরও পড়তে চান ++ লিঙ্ক থেকে প্রশ্নের জন্য উত্তর পড়তে এবং দেখতে এই মহান স্লাইডশো। এটি আপনাকে হুডের নিচে কী রয়েছে এবং এটি কীভাবে কাজ করছে তা বুঝতে সহায়তা করবে; এটি "ম্যাজিক" পূর্ণ কোনও আর স্লাইডশো নয়। আমি নিশ্চিত যে এমনকি বেশিরভাগ অভিজ্ঞ সি / সি ++ প্রোগ্রামারও এ থেকে অনেক কিছু শিখতে পারে।


3

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

এটি আমার পূর্ববর্তী পোস্টে উল্লেখ করা হয়েছিল যা এতে অটো বৈশিষ্ট্য এবং এর জন্য দরকারী লিঙ্কের সুবিধা রয়েছে ।

https://stackoverflow.com/a/26170069/2724703

সুতরাং, আমরা যদি উপরের কোডটি পরিবর্তন করি এবং আসল প্রকারগুলি স্বয়ংক্রিয় সাথে প্রতিস্থাপন করি তবে প্রোগ্রামটিও সংকলন করবে না।

void updateEffect(){
    for(int i=0;i<1000;i++){
        auto r;
        auto g;
        auto b;
        star[i].setColor(r%255,g%255,b%255);
        auto isVisible;
        star[i].setVisible(isVisible);
    }
}

3

আমি চিন্তা আপনার পছন্দ। সত্যই বাক্সের বাইরে। তবে ট্রেডঅফ আসলেই মূল্যবান নয়। মেমরি-রানটাইম ট্রেড অফ একটি জিনিস, রানটাইমের জন্য অপরিজ্ঞাত আচরণ নয়

আপনি আপনার ব্যবসার যুক্তি হিসাবে যেমন "এলোমেলো" ব্যবহার করছেন তা জানার জন্য এটি অবশ্যই আপনাকে একটি বিস্ময়কর অনুভূতি বোধ করবে। আমি এটা করতাম না।


3

ব্যবহার করুন 7757সব জায়গাতেই uninitialized ভেরিয়েবল ব্যবহার করতে হয় লুব্ধ। আমি এটিকে প্রাথমিক সংখ্যাগুলির তালিকা থেকে এলোমেলোভাবে বেছে নিয়েছি:

  1. এটা সংজ্ঞায়িত আচরণ

  2. এটি সর্বদা 0 না থাকার গ্যারান্টিযুক্ত

  3. এটা প্রধান

  4. এটি সম্ভবত পরিসংখ্যানগতভাবে এলোমেলো ভেরিয়েবলগুলির মতো এলোমেলো হতে পারে

  5. এটি নির্বিঘ্নিত ভেরিয়েবলগুলির চেয়ে দ্রুত হতে পারে যেহেতু এর মানটি সংকলন সময়ে জানা যায়


তুলনা করার জন্য, এই উত্তরের ফলাফলগুলি দেখুন: stackoverflow.com/a/31836461/2963099
গ্লেন টাইটেলবাম

1

বিবেচনা করার আরও একটি সম্ভাবনা রয়েছে।

আধুনিক সংকলক (আহেমে জি ++) এতটাই বুদ্ধিমান যে তারা কী নির্দেশাবলী রাষ্ট্রকে প্রভাবিত করে এবং কী করে না তা দেখতে আপনার কোডের মধ্য দিয়ে যায় এবং কোনও নির্দেশ যদি রাষ্ট্রকে প্রভাবিত না করার গ্যারান্টিযুক্ত হয় তবে জি ++ কেবল সেই নির্দেশকে সরিয়ে দেবে।

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

এই পদ্ধতিটি দরকারী, তবে আমি কী করব তা এখানে। র্যান্ড () গতির সাথে ইউবি (অনির্ধারিত আচরণ) একত্রিত করুন।

অবশ্যই, rand()কার্যকর করা গুলি হ্রাস করুন , তবে সেগুলিকে মিশ্রণ করুন যাতে সংকলক আপনার চান না এমন কিছু করে না।

আমি তোমাকে গুলি করব না


আপনার কোডটি নির্বোধ কিছু করছে এবং এটি মুছে ফেলতে পারে এমন একটি সংকলক সিদ্ধান্ত নিতে পারে তা বিশ্বাস করা আমার পক্ষে খুব কঠিন। আমি এটা শুধুমাত্র দূরে নিখুত আশা করতে চাই অব্যবহৃত কোড , না অজ্ঞ কোড। আপনার কি পুনরুত্পাদনযোগ্য টেস্ট কেস আছে? যেভাবেই হোক, ইউবির সুপারিশ বিপজ্জনক। এছাড়াও, জিসিসি কেবলমাত্র একমাত্র সক্ষম সংকলক নয়, সুতরাং এটি "আধুনিক" হিসাবে প্রকাশ করা অন্যায়।
আন্ডারস্কোর_ড ই

-1

এলোমেলোভাবে ব্যবহারের জন্য অবিচ্ছিন্ন ডাটা ব্যবহার করা যদি সঠিকভাবে করা হয় তবে অগত্যা কোনও খারাপ জিনিস নয়। আসলে, ওপেনএসএসএল এটির পিআরএনজি বীজ করার জন্য ঠিক এটি করে।

স্পষ্টতই এই ব্যবহারটি যথাযথভাবে নথিভুক্ত করা হয়নি, কারণ কেউ ভলগ্রিন্ডকে অবিশ্রুত ডেটা ব্যবহার করার বিষয়ে অভিযোগ করেছে এবং এটি "স্থির" করেছে, যা পিআরএনজিতে একটি বাগ তৈরি করেছে

সুতরাং আপনি এটি করতে পারেন তবে আপনি কী করছেন তা আপনার জানতে হবে এবং আপনার কোডটি যে কেউ পড়ছেন এটি বুঝতে পেরেছেন তা নিশ্চিত করা উচিত।


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

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