random.seed (): এটি কী করে?


177

random.seed()পাইথনে কী করায় আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি । উদাহরণস্বরূপ, নীচের পরীক্ষাগুলি তারা কী করে (ধারাবাহিকভাবে) করে?

>>> import random
>>> random.seed(9001)
>>> random.randint(1, 10)
1
>>> random.randint(1, 10)
3
>>> random.randint(1, 10)
6
>>> random.randint(1, 10)
6
>>> random.randint(1, 10)
7

আমি এটিতে ভাল ডকুমেন্টেশন খুঁজে পাইনি।


30
এলোমেলো সংখ্যা জেনারেশন সত্যই "এলোমেলো" নয়। এটি নির্বিচারবাদী এবং এটি যে ক্রমটি উত্পন্ন করে তা আপনি যে বীজের মূল্য দিয়ে যান তার দ্বারা নির্ধারিত হয় random.seed। সাধারণত আপনি কেবল প্রার্থনা করেন random.seed()এবং এটি বর্তমান সময়টিকে বীজের মান হিসাবে ব্যবহার করে, যার অর্থ যখনই আপনি স্ক্রিপ্টটি চালাবেন আপনি মানগুলির একটি পৃথক ক্রম পাবেন।
আসাদ সাইদুদ্দিন

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

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

উল্লেখযোগ্য: এই পোস্টে প্রদর্শিত ক্রমটি পাইথন 2 এ রয়েছে পাইথন 3 একটি পৃথক ক্রম দেয়।
ggorlen

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

উত্তর:


213

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

একটি সিউডো-এলোমেলো নম্বর জেনারেটর বপন করা এটির প্রথম "পূর্ববর্তী" মান দেয়। প্রতিটি বীজ মান একটি প্রদত্ত এলোমেলো সংখ্যা জেনারেটরের জন্য উত্পন্ন মানের ক্রমের সাথে সামঞ্জস্য করবে। এটি হ'ল যদি আপনি একই বীজ দু'বার সরবরাহ করেন তবে আপনি দুটি সংখ্যার একই ক্রম পাবেন।

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


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

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

আপনি কিছু বাস্তব জীবনের দৃশ্যের সাথে ব্যাখ্যা করতে মন চাইবেন? আমি একই জন্য একটি ব্যবহার কেস বুঝতে পারি না। আমাদের অন্যান্য প্রোগ্রামিং ভাষায়ও এর অনুরূপ কিছু রয়েছে?
শশাঙ্ক বিবেক

1
এখানে একটি বাস্তব জীবনের পরিস্থিতি: স্ট্যাকওভারফ্লো . com / জিজ্ঞাসা / ৫৮636363৩৩৩/২ । গবেষণার জন্য পুনরুত্পাদনযোগ্য ফলাফল তৈরি করতে এলোমেলো বীজও সাধারণ। উদাহরণস্বরূপ, আপনি যদি কোনও ডেটা বিজ্ঞানী হন এবং আপনি কিছু জাতীয় মডেলের সাথে ফলাফলগুলি প্রকাশ করতে চান যা এলোমেলো ব্যবহার করে (উদাহরণস্বরূপ একটি এলোমেলো বন), আপনি আপনার প্রকাশিত কোডে একটি বীজ অন্তর্ভুক্ত করতে চাইবেন যাতে লোকেরা নিশ্চিত করতে পারেন যে আপনার গণনাগুলি পুনরুত্পাদনযোগ্য।
গ্যালেন লং

89

অন্যান্য সমস্ত উত্তরগুলি এলোমেলো.সীড () ব্যবহারের ব্যাখ্যা বলে মনে হচ্ছে না। এখানে একটি সাধারণ উদাহরণ ( উত্স ):

import random
random.seed( 3 )
print "Random number with seed 3 : ", random.random() #will generate a random number 
#if you want to use the same random number once again in your program
random.seed( 3 )
random.random()   # same random number as before

33
>>> random.seed(9001)   
>>> random.randint(1, 10)  
1     
>>> random.seed(9001)     
>>> random.randint(1, 10)    
1           
>>> random.seed(9001)          
>>> random.randint(1, 10)                 
1                  
>>> random.seed(9001)         
>>> random.randint(1, 10)          
1     
>>> random.seed(9002)                
>>> random.randint(1, 10)             
3

আপনি এই চেষ্টা করুন।

ধরা যাক 'এলোমেলো.সীড' এলোমেলো মান জেনারেটরকে ('random.randint ()') দেয় যা এই বীজের ভিত্তিতে এই মানগুলি তৈরি করে। এলোমেলো সংখ্যার প্রয়োজনীয় বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল এগুলি পুনরুত্পাদনযোগ্য হওয়া উচিত। আপনি যখন একই বীজ রাখেন, আপনি এলোমেলো সংখ্যার একই প্যাটার্নটি পান। এইভাবে আপনি শুরু থেকেই এগুলি তৈরি করছেন। আপনি একটি ভিন্ন বীজ দিন it এটি একটি ভিন্ন প্রাথমিক দিয়ে শুরু হয় (3 এর উপরে)।

একটি বীজ দেওয়া হয়েছে, এটি একের পর এক 1 এবং 10 এর মধ্যে এলোমেলো সংখ্যা উত্পন্ন করবে। সুতরাং আপনি এক বীজ মানের জন্য সংখ্যার একটি সেট ধরে নিলেন।


15

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

পূর্ববর্তী মান না থাকলে বর্তমান সময় স্বয়ংক্রিয়ভাবে পূর্ববর্তী মান হিসাবে। আমরা নিজের ব্যবহার করে এই আগের মানটি সরবরাহ করতে পারি random.seed(x)যেখানে xকোনও সংখ্যা বা স্ট্রিং ইত্যাদি হতে পারে using

অতএব random.random()আসলে নিখুঁত এলোমেলো সংখ্যা নয়, এটি মাধ্যমে ভবিষ্যদ্বাণী করা যেতে পারে random.seed(x)

import random 
random.seed(45)            #seed=45  
random.random()            #1st rand value=0.2718754143840908
0.2718754143840908  
random.random()            #2nd rand value=0.48802820785090784
0.48802820785090784  
random.seed(45)            # again reasign seed=45  
random.random()
0.2718754143840908         #matching with 1st rand value  
random.random()
0.48802820785090784        #matching with 2nd rand value

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


11
Seed() can be used for later use ---

Example:
>>> import numpy as np
>>> np.random.seed(12)
>>> np.random.rand(4)
array([0.15416284, 0.7400497 , 0.26331502, 0.53373939])
>>>
>>>
>>> np.random.seed(10)
>>> np.random.rand(4)
array([0.77132064, 0.02075195, 0.63364823, 0.74880388])
>>>
>>>
>>> np.random.seed(12) # When you use same seed as before you will get same random output as before
>>> np.random.rand(4)
array([0.15416284, 0.7400497 , 0.26331502, 0.53373939])
>>>
>>>
>>> np.random.seed(10)
>>> np.random.rand(4)
array([0.77132064, 0.02075195, 0.63364823, 0.74880388])
>>>

11
# Simple Python program to understand random.seed() importance

import random

random.seed(10)

for i in range(5):    
    print(random.randint(1, 100))

উপরের প্রোগ্রামটি একাধিকবার প্রয়োগ করুন ...

প্রথম প্রচেষ্টা: 1 থেকে 100 এর মধ্যে 5 এলোমেলো পূর্ণসংখ্যা মুদ্রণ করে

2 য় প্রচেষ্টা: একই 5 টি এলোমেলো সংখ্যা প্রিন্ট করে উপরের সম্পাদনাটিতে উপস্থিত হয়েছিল।

3 য় প্রচেষ্টা: একই

.....শীঘ্রই

ব্যাখ্যা: প্রতিবার আমরা উপরের প্রোগ্রামটি চালাচ্ছি যখন আমরা 10 তে বীজ স্থাপন করি, তখন এলোমেলো জেনারেটর এটিকে রেফারেন্স ভেরিয়েবল হিসাবে গ্রহণ করে। এবং তারপরে কিছু পূর্বনির্ধারিত সূত্র করে এটি একটি এলোমেলো সংখ্যা তৈরি করে।

অতএব পরবর্তী মৃত্যুদন্ডে 10 এ বীজ সেট করা পুনরায় উল্লেখের সংখ্যা 10 এ সেট করে এবং আবার একই আচরণ শুরু হয় ...

যত তাড়াতাড়ি আমরা বীজ মান পুনরায় সেট করার সাথে সাথে এটি একই গাছপালা দেয়।

দ্রষ্টব্য: বীজের মান পরিবর্তন করুন এবং প্রোগ্রামটি চালান, আপনি আগেরটির চেয়ে আলাদা এলোমেলো ক্রম দেখতে পাবেন।


7

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


6

তবে, আপনি random.seed(samedigit)আবার ব্যবহার করার সময় এটি একই র্যান্ডম কোর্সের ফলাফল উত্পন্ন করতে ব্যবহৃত হয়।

In [47]: random.randint(7,10)

Out[47]: 9


In [48]: random.randint(7,10)

Out[48]: 9


In [49]: random.randint(7,10)

Out[49]: 7


In [50]: random.randint(7,10)

Out[50]: 10


In [51]: random.seed(5)


In [52]: random.randint(7,10)

Out[52]: 9


In [53]: random.seed(5)


In [54]: random.randint(7,10)

Out[54]: 9

4

seed(x)এলোমেলো সংখ্যার একটি সেট তৈরি করার আগে সেট করুন এবং একই সেটটি এলোমেলো সংখ্যার একই সেট তৈরি করতে ব্যবহার করুন। সমস্যাগুলি পুনরুত্পাদন করার ক্ষেত্রে কার্যকর।

>>> from random import *
>>> seed(20)
>>> randint(1,100)
93
>>> randint(1,100)
88
>>> randint(1,100)
99
>>> seed(20)
>>> randint(1,100)
93
>>> randint(1,100)
88
>>> randint(1,100)
99
>>> 

3

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

np.random.seed( 3 )
print(np.random.randn()) # output: 1.7886284734303186

np.random.seed( 3 )
print(np.random.rand()) # different function. output: 0.5507979025745755

np.random.seed( 5 )
print(np.random.rand()) # different seed value. output: 0.22199317108973948

1

এখানে একটি ছোট পরীক্ষা যা দেখায় যে seed()একই যুক্তি দিয়ে পদ্ধতিটি খাওয়ানো একই ছদ্ম-এলোমেলো ফলাফলের কারণ ঘটবে:

# testing random.seed()

import random

def equalityCheck(l):
    state=None
    x=l[0]
    for i in l:
        if i!=x:
            state=False
            break
        else:
            state=True
    return state


l=[]

for i in range(1000):
    random.seed(10)
    l.append(random.random())

print "All elements in l are equal?",equalityCheck(l)

4
সংক্ষিপ্ত সাম্যতার চেক:len(set(l))<=1
অলিভার নি

0

random.seed(a, version)পাইথন ইন সিউডো-র্যান্ডম নম্বর জেনারেটর (পিআরএনজি) শুরু করার জন্য ব্যবহৃত হয় ।

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

যুক্তি a হল বীজ মান। যদি মান হয় Noneতবে ডিফল্টরূপে, বর্তমান সিস্টেম সময় ব্যবহৃত হয়।

এবং versionএকটি পূর্ণসংখ্যা যা পরামিতিটিকে পূর্ণসংখ্যায় রূপান্তর করতে পারে তা নির্দিষ্ট করে। ডিফল্ট মান 2।

import random
random.seed(9001)
random.randint(1, 10) #this gives output of 1
# 1

আপনি যদি একই র্যান্ডম নম্বরটি পুনরুত্পাদন করতে চান তবে আবার একই বীজ সরবরাহ করুন

random.seed(9001)
random.randint(1, 10) # this will give the same output of 1
# 1

আপনি যদি বীজ সরবরাহ না করেন তবে এটি পূর্বের মতো 1 টি নয় বরং বিভিন্ন সংখ্যা উত্পন্ন করে

random.randint(1, 10) # this gives 7 without providing seed
# 7

আপনি যদি আগের চেয়ে আলাদা বীজ সরবরাহ করেন তবে এটি আপনাকে একটি ভিন্ন এলোমেলো নম্বর দেবে

random.seed(9002)
random.randint(1, 10) # this gives you 5 not 1
# 5

সুতরাং, সংক্ষেপে, আপনি যদি একই র্যান্ডম সংখ্যাটি পুনরুত্পাদন করতে চান তবে বীজ সরবরাহ করুন। বিশেষত, একই বীজ

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