বাশে এন কমান্ডের বাইরে 1 কমান্ড কিভাবে চালানো যায়


15

আমি এলোমেলোভাবে একটি কমান্ড চালানোর জন্য একটি উপায় চাই, 10 বারের মধ্যে 1 বলে। এটি করার জন্য কোনও বিল্টিন বা জিএনইউ কোর্টিল রয়েছে, আদর্শভাবে এমন কিছু:

chance 10 && do_stuff

যেখানে do_stuff10 বার 1 টি কার্যকর করা হয়? আমি জানি আমি একটি স্ক্রিপ্ট লিখতে পারি, তবে এটি মোটামুটি সাধারণ জিনিস বলে মনে হচ্ছে এবং আমি নির্ধারিত কোনও উপায় আছে কিনা তা নিয়ে ভাবছিলাম।


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

@ আলেকজান্দার এটি আসলে একটি স্ক্রিপ্ট নয়, কেবল একটি লাইন। আমি একটি ক্রন-পেশা এটা ব্যবহার করছি আমাকে এলোমেলোভাবে হরদম অবহিত করার যেমন একটি অনুস্মারক কিছু করতে
retnikt

উত্তর:


40

ইন ksh, বাশ, জ্যাশ, ইয়াশ বা ব্যস্তবক্স sh:

[ "$RANDOM" -lt 3277 ] && do_stuff

RANDOMতাই উপরে (পাসে) একটি এক-ইন-দশ সুযোগ Korn থেকে, ব্যাশ, যশ, টু Z এবং busybox শাঁস বিশেষ পরিবর্তনশীল, 0 এবং 32767 প্রত্যেক সময় এটা মূল্যায়ন হচ্ছে মধ্যে একটি সিউডো-রেণ্ডম দশমিক পূর্ণসংখ্যা মান উৎপন্ন হয়।

আপনি এটি কোনও ফাংশন তৈরি করতে ব্যবহার করতে পারেন যা আপনার প্রশ্নে বর্ণিত হিসাবে আচরণ করে, কমপক্ষে বাশে:

function chance {
  [[ -z $1 || $1 -le 0 ]] && return 1
  [[ $RANDOM -lt $((32767 / $1 + 1)) ]]
}

একটি যুক্তি সরবরাহ করতে ভুলে যাওয়া, বা একটি অবৈধ যুক্তি সরবরাহ করা, 1 এর ফলাফল উত্পন্ন করবে, তাই chance && do_stuffকখনই হবে না do_stuff

এটি ব্যবহার করে "1 ইন এন " এর সাধারণ সূত্র ব্যবহার করে $RANDOMযা [[ $RANDOM -lt $((32767 / n + 1)) ]]32768 চান্সে একটি (732767 / n ⎦ + 1) দেয়। nসম্ভাব্য মানগুলির পরিসীমাতে অসম বিভক্ত হওয়ার কারণে যার মানগুলি 32768 এর গুণক নয় তা পক্ষপাতিত্ব প্রবর্তন করে।


(১/২) এই ইস্যুটি পুনরায় দেখার সময়: এটি অংশীদারিগুলির সংখ্যার উপরের সীমা থাকতে হবে তা স্বজ্ঞাত, উদাহরণস্বরূপ, 40.000 অংশ থাকা সম্ভব নয়। আসলে আসল সীমাটি বেশ ছোট। ইস্যুটি হ'ল প্রতিটি অংশটি কতটা বড় হতে পারে তার পূর্ণসংখ্যা বিভাগ কেবলমাত্র একটি অনুমান। এটি প্রয়োজন যে টানা দুটি অংশের ফলে সীমাটির পার্থক্যের পরিমাণ $((32767/parts+1))1 এর চেয়ে বড় হয় বা বিভাগের ফলাফল (এবং তাই সীমা) একই হতে পারে আমরা 1 এর অংশের সংখ্যা বাড়ার ঝুঁকিতে চলে যাই। (অবিরত ..)
ইসহাক

(২/২) (বিস্তৃত ..) এটি আসলে উপলব্ধের চেয়ে আরও বেশি সংখ্যার জন্য অ্যাকাউন্ট করবে। এর সূত্রটি হ'ল (32767/n-32767/(n+1))>=1এন এর জন্য সমাধান যা 181.5 ডলারে একটি সীমা দেয়। আসলে অংশগুলির সংখ্যা ইস্যু ছাড়াই 194 পর্যন্ত চলতে পারে। তবে ১৯৫ টি অংশে, ফলাফলের সীমাটি ১৫১, 194 ফলাফলের মতো একই ফলাফল। এটি অসঙ্গত এবং এড়ানো উচিত। সংক্ষেপে, অংশগুলির সংখ্যা (এন) এর উপরের সীমাটি 194 হতে হবে 194 আপনি সীমা পরীক্ষা করতে পারেন:[[ -z $1 || $1 -le 1 || $1 -ge 194 ]] && return 1
আইজাক

25

অ-মানক সমাধান:

[ $(date +%1N) == 1 ] && do_stuff

ন্যানোসেকেন্ডে বর্তমান সময়ের শেষ সংখ্যাটি 1 কিনা!


সেটা খুবই ভালো.
এরিক ডুমিনিল

2
আপনাকে নিশ্চিত করতে হবে যে [ $(date +%1N) == 1 ] && do_stuffনিয়মিত বিরতিতে কলটি ঘটে না, অন্যথায় এলোমেলোতা নষ্ট হয়ে যায়। while true; do [ $(date +1%N) == 1 ] && sleep 1; doneএকটি বিমূর্ত পাল্টা নমুনা হিসাবে ভাবেন । যাইহোক, ন্যানোসেকেন্ডগুলির সাথে খেলার ধারণাটি খুব ভাল, আমি মনে করি আমি এটি ব্যবহার করব, সুতরাং +1
জ্যাভিয়ারস্টুউ

3
@ জাভিয়ারস্টুউ আমি মনে করি কোডটি কয়েক সেকেন্ড চেক করে থাকলে আপনার কাছে একটি পয়েন্ট লাগবে। কিন্তু ন্যানোসেকেন্ডস? এটি সত্যিই এলোমেলো প্রদর্শিত হবে।
এরিক ডুমিনিল

9
@ এরিকডুমিনিল: দুর্ভাগ্যবশত: 1) সিস্টেম ঘড়িটি চুক্তিবদ্ধভাবে প্রকৃত ন্যানোসেকেন্ড রেজোলিউশন সরবরাহ করতে বাধ্য নয় (এটি নিকটতমটি হতে পারে clock_getres()), ২) শিডিয়ুলার নিষিদ্ধ নয়, উদাহরণস্বরূপ, সর্বদা 100-ন্যানোসেকেন্ডের সীমানায় টাইমলাইস শুরু করা (যা ঘড়িটি ঠিক ততক্ষণে পক্ষপাতিত্ব পরিচয় করিয়ে দেবে), 3) এলোমেলো মান অর্জনের সমর্থিত উপায় হ'ল (সাধারণত) /dev/urandomএর মান থেকে পড়া বা পরীক্ষা করা $RANDOM
কেভিন 21

1
@ কেভিন: মন্তব্যের জন্য অনেক ধন্যবাদ।
এরিক ডুমিনিল

21

ব্যবহারের বিকল্প $RANDOMহ'ল shufকমান্ড:

[[ $(shuf -i 1-10 -n 1) == 1 ]] && do_stuff

কাজ করবে কোনও ফাইল থেকে এলোমেলোভাবে লাইন নির্বাচন করার জন্যও দরকারী useful একটি সঙ্গীত প্লেলিস্ট জন্য।


1
Command আদেশটি জানতেন না। খুব সুন্দর!
আইজেনকনুর

12

প্রথম উত্তরের উপর উন্নতি করা এবং আপনি কী অর্জন করতে চাইছেন তা আরও স্পষ্ট করে তুলেছে:

[ $(( $RANDOM % 10 )) == 0 ] && echo "You win" || echo "You lose"

1
$RANDOM % 10$RANDOM
উত্পাদনের

1
@ ফুকলভ হ্যাঁ, এটির মতো পক্ষপাতিত্বও থাকবে "$RANDOM" -lt $((32767 / n + 1))
আইজেনকনুর

হ্যাঁ, পক্ষপাতটি অভিন্ন, 1-ইন-10 এর জন্য 0.1 এর পরিবর্তে 0.100006104 (0 এর বিপরীতে চেক করার সময়)।
স্টিফেন কিট

1

আপনি এলোমেলো বা পর্যায়ক্রম চান কিনা আমি নিশ্চিত নই ... পর্যায়ক্রমের জন্য:

for i in `seq 1 10 100`; do echo $i;done
1
11
21
31
41
51
61
71
81
91

আপনি আরও বিশৃঙ্খল কিছু উত্পাদন করতে উপরের "ND র্যান্ডোম" ট্রিকটির সাথে এটি মিশ্রণ করতে পারেন, উদাহরণস্বরূপ:

আমি ভিতরে seq 1 1000 $RANDOM; ইকো $ i; করা হয়েছে

এইচটিএইচ :-)

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