কিভাবে এলোমেলো সংখ্যা জেনারেট করবেন?


23

আমি নতুন লাইনের দ্বারা পৃথক এক বা কয়েকটি এলোমেলো সংখ্যা উত্পন্ন করতে চাই।

এটি কিভাবে করা যায়?


1
খাঁটি ভিম? অথবা, বলুন, ব্যবহার করছেন :python?
মুরু

খাঁটি ভিএম পছন্দসই, তবে এটি বিল্ট-ইন না হলে কোনও সহজ স্মরণীয় পদ্ধতি ভাল is
কেনারব

উত্তর:


20

এর জন্য কোনও অন্তর্নির্মিত সুবিধা নেই, সুতরাং আপনাকে বাহ্যিক কিছু ব্যবহার করতে হবে।

ইউনিক্স শেল ( /bin/sh)

কল করা হচ্ছে:

strings -n 1 < /dev/urandom | tr -d '[:space:]' | head -c15

সঙ্গে system()একটি ভাল উপায়। আপনি প্রতিস্থাপন শুধুমাত্র সংখ্যা পেতে পারেন trসঙ্গে grep:

strings -n 1 < /dev/urandom | grep -o '[[:digit:]]' | head -c15

আপনি এটি ভিমে তেমন ব্যবহার করতে পারেন:

:echo system("strings -n 1 < /dev/urandom | grep -o '[[:digit:]]'  | head -c15")

15 নম্বরটি হ'ল সংখ্যার পরিমাণ যা আপনি চান (সেই অনুযায়ী সামঞ্জস্য করুন)। এটি লিনাক্স, বিএসডি, ওএসএক্স এবং অন্যান্য ইউএনআইএক্স সিস্টেমে কাজ করা উচিত। এটি এমএস উইন্ডোজে কাজ করবে না।

এছাড়াও আমার ওয়েবলগ পোস্টটি " কমান্ডলাইন থেকে পাসওয়ার্ড তৈরি করুন " দেখুন ( এটির জন্য এখানে অনেকগুলি খারাপ সমাধান রয়েছে)।

চুনি

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

:ruby puts Random.rand(10)

অথবা 15 নম্বর পেতে:

:ruby 15.times { puts Random.rand(10) }

পাইথন

আপনি এলোমেলো মডিউল ব্যবহার করতে পারেন ; একটি একক পেতে:

:py import random; print(random.randint(0, 9))

অথবা একটি 15 সংখ্যা:

:py import random
:py for i in range(0, 15): print(random.randint(0, 9))

এটি পাইথন 2 এবং 3 উভয়ের জন্যই কাজ করা উচিত।

উইন্ডোজ পাওয়ারশেল

আপনি Get-Random এলোমেলো নম্বর পেতে ব্যবহার করতে পারেন :

:echo system('Get-Random')

উইন্ডোজ cmd.exe

উইন্ডোজ 7 এবং তারপরে পাওয়ারশেলের সাথে জাহাজ পাঠানো উচিত, তবে আপনি যদি সর্বাধিক সামঞ্জস্য চান তবে আপনি ব্যবহার করতে পারেন cmd.exe। এটির একটি বিশেষ পরিবর্তনশীল রয়েছে %RANDOM%:

:echo system('@echo %RANDOM%')

দ্রষ্টব্য: এটি খুব এলোমেলো নয়! , এটি সময় (!) ব্যবহার করে


নোট করুন যে রুবি বা পাইথন সমাধানগুলি ব্যবহার করার জন্য আপনাকে রুবি বা পাইথন বাইন্ডিংগুলি ব্যবহার করার দরকার নেই; আপনি একটি পৃথক স্ক্রিপ্ট তৈরি করতে এবং তাদের সাথে কল করতে পারেন system("python -c '...'")(এটির জন্য অবশ্যই রুবি / পাইথন ইনস্টল করা দরকার।


পরিবর্তে tr -d '[:space:]', সম্ভবত tr -cd '[:digit:]'গ্রেপ ফিল্টার জন্য?
মুরু

@ মুরু আমি নিশ্চিত নই যে ওএসএক্সে এটি কাজ করবে, এ কারণেই আমি এটি ব্যবহার করিনি ...
ওপিরা

যদি তা হয় .... জিএনইউ বিএসডিকে মারধর করে। : পি
মুরু

কেউ এলোমেলো সংখ্যার ইনপুট করার জন্য শেল (সিস্টেম) ব্যবহার করতে পারে, যেমন :r! hexdump -n $((3*4)) -e '"%d"' /dev/urandom, 3 টি এলোমেলো স্বাক্ষরিত পূর্ণসংখ্যার উত্পাদন করতে পারে।
এইচএল 9001

1
@ টেনরব এটি 3 স্বাক্ষরিত এলোমেলো পূর্ণসংখ্যার ইনপুট দেওয়ার জন্য শেলটি সঠিকভাবে ব্যবহার করবে::r! hexdump -n $((3*4)) -e '"\%d\n"' /dev/urandom
এইচএল 9001

12

এখানে একটি খাঁটি ভিমস্ক্রিপ্ট সমাধান রয়েছে। আমি এটি তৈরি করিনি, এটি চার্লস ই ক্যাম্পবেল দ্বারা বিকাশ করা হয়েছিল। আপনি তার কোড সহ গিথুব রেপোটি এখানে পেতে পারেন


অ্যালগরিদম Vim প্রারম্ভকালে উত্পাদিত 3 টি বীজ ব্যবহার করে এবং বীজগুলিতে প্রয়োগ করা গণনা এবং ক্রমবর্ধনের উপর ভিত্তি করে সিউডো-এলোমেলো সংখ্যা তৈরি করে:

" Randomization Variables
" with a little extra randomized start from localtime()
let g:rndm_m1 = 32007779 + (localtime()%100 - 50)
let g:rndm_m2 = 23717810 + (localtime()/86400)%100
let g:rndm_m3 = 52636370 + (localtime()/3600)%100

ভেরিয়েবলের সুযোগটি বিশ্বব্যাপী হিসাবে ঘোষণা করা হয় কারণ এগুলি জেনারেটর ফাংশন দ্বারা ব্যবহৃত হয় তবে এটি স্ক্রিপ্টের মধ্যে সীমাবদ্ধ থাকতে পারে ( s:)

এবং এখানে জেনারেটর ফাংশন:

function! Rndm()
    let m4= g:rndm_m1 + g:rndm_m2 + g:rndm_m3
    if( g:rndm_m2 < 50000000 )
        let m4= m4 + 1357
    endif
    if( m4 >= 100000000 )
        let m4= m4 - 100000000
        if( m4 >= 100000000 )
            let m4= m4 - 100000000
        endif
    endif
    let g:rndm_m1 = g:rndm_m2
    let g:rndm_m2 = g:rndm_m3
    let g:rndm_m3 = m4
    return g:rndm_m3
endfun

রেপোতে নিম্নলিখিত ফাংশন অন্তর্ভুক্ত রয়েছে:

  • বীজের একটি "এলোমেলো" আদিকরণ;
  • একটি পাঠ্য ফাইল থেকে কিছু ব্যবহারকারী-সংজ্ঞায়িত বীজ পড়ার উপায়;
  • একটি ছদ্ম র্যান্ডম জেনারেটর
  • কয়েকটি এলোমেলো ফাংশন:
    • এমন একটি ফাংশন যা একটি ব্যাপ্তির মধ্যে একটি এলোমেলো সংখ্যা তৈরি করে
    • একটি পাশা ঘূর্ণায়মান ফাংশন
    • ক্রমক্রমিক পূর্ণসংখ্যার একটি তালিকা এলোমেলোভাবে অদলবদল করার জন্য একটি ফাংশন

জেনারেটরটি পরীক্ষা করার জন্য আমি এখানে লিখেছিলাম একটি দ্রুত পরীক্ষা: আমি 0 এবং 9 এর মধ্যে 1000000 নম্বর উত্পন্ন করেছি এবং প্রতিটি সংখ্যার সংখ্যার সংখ্যা এখানে গণনা করেছি ফলাফল:

0 : 100409
1 : 99435
2 : 100433
3 : 99578
4 : 100484
5 : 99948
6 : 100394
7 : 99649
8 : 99803
9 : 99867

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


7

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

function! s:randnum(max) abort
  return str2nr(matchstr(reltimestr(reltime()), '\v\.@<=\d+')[1:]) % a:max
endfunction

4

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

:py import vim, random; vim.current.line += str(random.randint(0, 9))

দ্রষ্টব্য: আপনার ভিম পাইথন সমর্থন করে কিনা তা পরীক্ষা করতে, চেষ্টা করুন: :echo has('python')( হ্যাঁর জন্য 1)।

আপনি শেলটি ব্যবহার করতে পারেন যা $RANDOMভেরিয়েবল প্রস্তাব করে (ব্যাশ / কেএসএইচ / জেডএসের সাথে কাজ করে) যা সিউডোরেন্ডম (0-32767) প্রদান করে, উদাহরণস্বরূপ:

:r! echo $RANDOM

বা:

:put =system('echo $RANDOM')

বা:

:r! od -An -td -N1 /dev/urandom

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

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

:put =reltimestr(reltime())[-2:]

দ্রষ্টব্য: আপনি যদি এটি প্রায়শই ব্যবহার করেন তবে একটি সাধারণ ফাংশন লিখুন যা হবে return reltimestr(reltime())[-4:]

দ্রষ্টব্য: উপরের পদ্ধতিগুলি কেবলমাত্র একটি সিউডোরানডম পূর্ণসংখ্যা দেয় যা একটি এনক্রিপশন কী তৈরি করতে ব্যবহার করা উচিত নয়।


আরও এলোমেলো সংখ্যা যুক্ত @:করতে আবার কমান্ডটি পুনরাবৃত্তি করতে টিপুন । বা সংখ্যার (যেমন 10@:) উপসর্গটি নতুন লাইনের দ্বারা পৃথক করে এলোমেলো সংখ্যার যোগ করতে।


সম্পর্কিত:


এছাড়া সাথে কাজ করে zsh, কিন্তু না দিয়ে sh, dash, fish, csh, অথবা tcsh... আপনি ব্যবহার করতে পারে :r! bash -c 'echo $RANDOM'...
মার্টিন Tournoij

"বর্তমান টাইমস্ট্যাম্প থেকে শেষের কয়েকটি অঙ্ক ফিরে আসুন" -> এটি এলোমেলো নয়। সিউডো-এলোমেলো নম্বর পাওয়ার জন্য সময়টি ব্যবহার করা প্রায়শই একটি খারাপ ধারণা, এমনকি অ-ক্রাইপ্টো উদ্দেশ্যেও। যদি টাইমস্ট্যাম্পের রেজোলিউশনটি সেকেন্ডে হয় এবং আপনি একটি "ফাইল। $ এলোমেলো" সেকেন্ডে দু'বার তৈরি করেন? ওহো! ... এছাড়াও, আপনি কখনই বুঝতে পারবেন না যে কেউ যখন আপনার GetRandom()ফাংশনটি ব্যবহার করতে চলেছে যেখানে ভাল প্রঙের জন্য কিছু যায় আসে , তাই সম্ভব হলে এটি শুরু থেকেই ঠিক করা ভাল (এবং এটি এখানে প্রায় সর্বদা সম্ভব!)
মার্টিন টর্নয়েজ

$RANDOMগুণমানটি কী তা আমি জানি না , তবে এটি যদি দুর্বল পিআরএনজি হয় তবে এটি এমনকি দরিদ্র পিআরএনজি ব্যবহার করার কারণ নয় :-) পরিবর্তে আরও ভাল পিআরএনজিতে আপগ্রেড করুন! যতদূর আমি জানি, /dev/urandomসমস্ত প্ল্যাটফর্মগুলিতে যেখানে bashসাধারণত পাওয়া যায় সেগুলি উপলভ্য, তাই এটি ব্যবহার না করার কোনও কারণ আমি দেখতে পাচ্ছি না
মার্টিন টর্নয়েজ

1
আমি সম্পর্কে জানতাম না $RANDOM। দেখতে খুব সুন্দর একটি ছোট্ট সরঞ্জামের মতো মনে হয় এবং এটি "দরিদ্র লোক আরএনজি" হতে পারে (যেমন @ কার্পেটসোমকার উল্লেখ করেছেন) এটি অবশ্যই @ কেনরবকে (যিনি প্রশ্ন জিজ্ঞাসা করেছিলেন) "সহজেই স্মরণীয়" প্রয়োজনীয়তার সাথে খাপ খায়।
ডালকার

4

আপনার ভিম বাইনারিতে প্যাচ 8.1.2342 অন্তর্ভুক্ত থাকে তবে আপনি rand()এবং srand()ফাংশনগুলি ব্যবহার করতে পারেন ।


উদাহরণস্বরূপ, 10 টি এলোমেলো সংখ্যা তৈরি করতে নিউলাইনগুলি দ্বারা পৃথক:

let seed = srand()
echo range(10)->map({-> rand(g:seed)})->join("\n")

সমস্ত 100 কে নিকৃষ্টমানের 10 টি এলোমেলো সংখ্যা তৈরি করতে:

let seed = srand()
echo range(10)->map({-> rand(g:seed) % 100})->join("\n")

5 টি বর্ণের 10 এলোমেলো বর্ণমালা স্ট্রিং উত্পন্ন করতে:

let seed = srand()
echo range(10)
   \ ->map({-> range(5)
   \           ->map({-> (97+rand(g:seed) % 26)->nr2char()})->join('')})
   \ ->join("\n")

10 টি এলোমেলো শব্দ উত্পন্ন করতে (অভিধান ফাইল থেকে নেওয়া /usr/share/dict/words):

let seed = srand()
let words = readfile('/usr/share/dict/words')
let len = len(words)
echo range(10)->map({-> g:words[rand(g:seed) % g:len]})->join("\n")

5 এলোমেলো শব্দের 10 ক্রম উত্পন্ন করতে:

let seed = srand()
let words = readfile('/usr/share/dict/words')
let len = len(words)
echo range(10)
   \ ->map({-> range(5)
   \           ->map({-> g:words[rand(g:seed) % g:len]})->join()})
   \ ->join("\n")

একটি এলোমেলো ইউইউডি সংস্করণ 4 উত্পাদন করতে:

" Based on this answer: /programming//a/38191078/9780968
let seed = srand()
let random_numbers = range(30)->map({-> rand(g:seed) % 16})
echo call('printf', ['%x%x%x%x%x%x%x%x-%x%x%x%x-4%x%x%x'] + random_numbers[:14])
 \ ..call('printf', ['-X%x%x%x-%x%x%x%x%x%x%x%x%x%x%x%x'] + random_numbers[15:])
 \   ->substitute('X', '89ab'[rand(seed) % 4], '')

এলোমেলো রঙের স্কিম প্রয়োগ করতে:

let seed = srand()
let colorschemes = getcompletion('', 'color')
let len = colorschemes->len()
exe 'colo '..colorschemes[rand(seed) % len]

3

আমি মনে করি না ভিমস্ক্রিপ্টে এলোমেলো সংখ্যার জন্য একটি স্থানীয় ফাংশন আছে।

একটি উপায় ব্যবহার করে :python(এটি কোনও ফাংশনে ব্যবহার করুন, সম্ভবত, 10000 এবং 60 টি পরামিতি দ্বারা প্রতিস্থাপন করা হয়েছে):

:python <<EOF
import vim
import random

line = vim.current.window.cursor[0]
r = getattr(__builtins__, 'xrange', range) # To make it work for both Python 2 & 3
vim.current.buffer[line:line] = list(map(str, random.sample(r(10000), 60)))
EOF

ভিমের পাইথন স্ক্রিপ্টিংয়ের দ্রুত পরিচয়ের জন্য পাইথনের মাধ্যমে ভিমে একটি বাক্স তৈরির আমার উত্তর দেখুন to

যেহেতু vim.current.bufferস্ট্রিংগুলির একটি তালিকা, আমরা পাইথনে যেভাবে স্ট্রিংয়ের তালিকা তৈরি করব সেভাবেই assign random.sampleপাইথনের এলোমেলো পূর্ণসংখ্যার একটি তালিকা পেতে আমি কেবল সবচেয়ে সহজ উপায়।


@ random.sampleকারপেটস্মোকার পাইথন 2 এ কেবলমাত্র দুটি যুক্তিই মেরামত করে, strজিনিসগুলিকে স্ট্রিংয়ে রূপান্তর করতে অন্তর্নির্মিত কাজ। আমাকে পাই 3 সমতুল্য সন্ধান করা যাক ( strএকই রকম হবে, চেক করতে হবে xrangeএবং random.sample)।
মুরু

@ কার্পেটস্মোকার আরগ, টাইপো 60 এর পরে বন্ধনীটি 10000 এর পরে হওয়ার কথা। xrangeএবং পাইথন 3 এ নয় কারণ rangeএটি সমান (পায় 2 এর মত নয়, আসলে একটি rangeতালিকাও তৈরি করে না)।
মুরু

@ কার্পেটসমোকার এবং চূড়ান্ত পার্থক্যটি হ'ল mapপাই 3-এ একটি পুনরাবৃত্তিযোগ্য এবং একটি তালিকা নয়, তাই শেষ লাইনটি ব্যবহার করবেlist(map(str, random.sample(range(10000), 60)))
মুরু

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