गैर-दोहराव यादृच्छिक संख्या में खस्ता


92

मैं सुन्न में गैर-दोहराव यादृच्छिक संख्या कैसे उत्पन्न कर सकता हूं?

list = np.random.random_integers(20,size=(10))

"गैर-दोहराव" से आपका क्या मतलब है? यादृच्छिक संख्याओं का क्रम कभी नहीं आता है? यह संभव नहीं है, क्योंकि यादृच्छिक संख्या जनरेटर की स्थिति को कंप्यूटर की परिमित मेमोरी में फिट होने की आवश्यकता होती है। या क्या आपका मतलब है कि एक भी संख्या दो बार नहीं होती है?
स्वेन मार्नाच

5
गैर-दोहराव का मतलब है कि आपके पास एक सूची है जिसमें कोई डुप्लिकेट नहीं है।
बहुपद

2
शायद आपको एक यादृच्छिक क्रमपरिवर्तन की आवश्यकता है? docs.scipy.org/doc/numpy/reference/generated/…
cyborg

जवाबों:


112

numpy.random.Generator.choicereplaceप्रतिस्थापन के बिना नमूने के लिए एक तर्क प्रदान करता है :

from numpy.random import default_rng

rng = default_rng()
numbers = rng.choice(20, size=10, replace=False)

यदि आप बिना GeneratorAPI के पूर्व 1.17 नंबर पर हैं , तो आप random.sample()मानक पुस्तकालय से उपयोग कर सकते हैं :

print(random.sample(range(20), 10))

आप इसका उपयोग numpy.random.shuffle()और टुकड़ा कर सकते हैं , लेकिन यह कम कुशल होगा:

a = numpy.arange(20)
numpy.random.shuffle(a)
print a[:10]

replaceविरासत numpy.random.choiceसमारोह में एक तर्क भी है , लेकिन इस तर्क को अक्षम रूप से लागू किया गया था और फिर यादृच्छिक संख्या स्ट्रीम स्थिरता की गारंटी के कारण अक्षम छोड़ दिया गया था, इसलिए इसका उपयोग अनुशंसित नहीं है। (यह मूल रूप से फेरबदल और स्लाइस बात आंतरिक रूप से करता है।)


1
प्रिंट random.sample (रेंज (20), 10) अजगर 2.6 के साथ काम नहीं करता है ?!
एकेडेमिया

समस्या एक बुरा Pydev कॉन्फ़िगरेशन के कारण थी। थैक्स
एकेडेमिया

1
क्या होगा यदि मेरा एन 20 नहीं है, लेकिन 1000000 की तरह, लेकिन मुझे इसमें से केवल 10 अद्वितीय नंबर चाहिए, क्या अधिक मेमोरी कुशल दृष्टिकोण है?
मर्गलूम

2
@mrloloom Python 3 में, random.sample(range(n), 10))बहुत बड़े के लिए भी कुशल होगा n, क्योंकि एक rangeऑब्जेक्ट सिर्फ एक छोटा आवरण है, जिसमें स्टॉप स्टार्ट, स्टॉप और वैल्यू स्टोर होता है, लेकिन पूर्णांकों की पूरी सूची नहीं बनाता है। अजगर 2 में, आप बदल सकते हैं rangeके साथ xrangeएक समान व्यवहार मिलता है।
स्वेन मार्नाच

110

मुझे लगता numpy.random.sampleहै कि अभी काम नहीं करता है। यह मेरा तरीका है:

import numpy as np
np.random.choice(range(20), 10, replace=False)

26
इसके बजाय range(n)(या arange(n)) के पहले तर्क के रूप में choice, यह सिर्फ पास करने के लिए बराबर है n, उदा choice(20, 10, replace=False)
जोश बोड

1
ध्यान दें कि np.random.choice(a, size, replace=False)बड़े के लिए बहुत धीमी है a- मेरी मशीन पर, = 1M के लिए लगभग 30 एमएस।
मैथ्यू रहटज़

3
बहुत बड़े nउपयोग के लिए समय और स्मृति के मुद्दों से बचने के लिए numpy.random.Generator.choice(सुपीरियर v1.17 से शुरू)
बेबो

1
मेरे द्वारा देखा जाने वाला मुख्य नुकसान np.random.choice में अक्ष पैरामीटर नहीं है -> यह केवल 1d सरणियों के लिए है।
मोसेफेदर

3

वर्षों बाद, 10000 ^ 2 में से 40000 को चुनने के लिए कुछ समय (Numpy 1.8.1, imac 2.7 GHz):

import random
import numpy as np

n = 10000
k = 4
np.random.seed( 0 )

%timeit np.random.choice( n**2, k * n, replace=True )  # 536 µs ± 1.58 µs
%timeit np.random.choice( n**2, k * n, replace=False ) # 6.1 s ± 9.91 ms

# https://docs.scipy.org/doc/numpy/reference/random/index.html
randomstate = np.random.default_rng( 0 )
%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=False )  # 766 µs ± 2.18 µs
%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=True )   # 1.05 ms ± 1.41 µs

%timeit random.sample( range( n**2 ), k * n )          # 47.3 ms ± 134 µs

(10000 ^ 2 में से 40000 का चयन क्यों? बड़ी scipy.sparse.random matrices उत्पन्न करने के लिए - scipy 1.4.1 उपयोग करता है np.random.choice( replace=False ), slooooow।)

टोपी की टिप numpy.random लोगों को।


1

आप इसे छाँटकर भी प्राप्त कर सकते हैं:

random_numbers = np.random.random([num_samples, max_int])
samples = np.argsort(random_numbers, axis=1)

0

पायथन सेट सूची रूपांतरण का उपयोग किया जा सकता है। 0 से 20 के बीच 10 अद्वितीय संख्याएँ इस प्रकार प्राप्त की जा सकती हैं:

import numpy as np
import random
unique_numbers=set()
while(len(unique_numbers)<10):
    unique_numbers.add(np.random.randint(0,20))

unique_numbers=list(unique_numbers)
random.shuffle(unique_numbers)
print(unique_numbers)

-3

बस एक सरणी उत्पन्न करें जिसमें संख्याओं की आवश्यक सीमा होती है, फिर उन्हें सरणी में 0 वें तत्व के साथ यादृच्छिक रूप से स्वैप करके उन्हें फेरबदल करें। यह एक यादृच्छिक अनुक्रम पैदा करता है जिसमें डुप्लिकेट मान नहीं होते हैं।


2
परिणामी यादृच्छिक अनुक्रम की एक और संपत्ति यह है कि यह विशेष रूप से यादृच्छिक नहीं है
स्वेन मार्नाच

@SvenMarnach - अधिकांश प्रयोजनों के लिए, हालांकि, यह पर्याप्त यादृच्छिक है। यदि वह इसे और अधिक यादृच्छिक चाहता था तो वह दोहरे-यादृच्छिक दृष्टिकोण का उपयोग कर सकता था।
बहुपद

यह निराधार है। ओपी इसे सही करने के लिए लाइब्रेरी कॉल का उपयोग कर सकता है। वे उपयोग करना आसान है, तेजी से चलाते हैं और कस्टम संस्करण की तुलना में अधिक पठनीय हैं। मैं किसी भी कारण के बारे में नहीं सोच सकता कि मुझे यहां एक गलत एल्गोरिदम का उपयोग करना चाहिए क्योंकि यह संभवतः "यादृच्छिक रूप से पर्याप्त" है, जब सही एल्गोरिथ्म का उपयोग करने से कोई नुकसान नहीं होता है।
स्वेन मार्नाच

@SvenMarnach - पर्याप्त मेला। मैं सुन्न नहीं जानता, इसलिए मैं सिर्फ एक संभावित समाधान की पेशकश कर रहा था।
बहुपद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.