অকারণে পুনরাবৃত্তিযোগ্য এলোমেলো সংখ্যা


92

আমি কীভাবে নাম্বারে পুনরাবৃত্তিযোগ্য এলোমেলো সংখ্যা তৈরি করতে পারি?

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

"পুনরাবৃত্তি" বলতে কী বোঝ? যে এলোমেলো সংখ্যার ক্রম পুনরাবৃত্তি হয় না? এটি সম্ভব নয়, যেহেতু এলোমেলো সংখ্যার জেনারেটরের স্থিতি একটি কম্পিউটারের সীমাবদ্ধ মেমরির সাথে ফিট করে। অথবা আপনি কি বোঝাতে চেয়েছেন যে কোনও একক সংখ্যা দু'বার ঘটে না?
সোভেন মারনাচ

4
পুনরাবৃত্তি না করার অর্থ আপনার অনুলিপি ছাড়াই একটি তালিকা রয়েছে।
বহুব্যাপী

4
সম্ভবত আপনি একটি এলোমেলো অনুচ্ছেদে প্রয়োজন? docs.scipy.org/doc/numpy/references/generated/…
সাইবার্গ

উত্তর:


112

numpy.random.Generator.choicereplaceপ্রতিস্থাপন ছাড়াই নমুনায় একটি যুক্তি সরবরাহ করে:

from numpy.random import default_rng

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

আপনি যদি Generatorএপিআই ছাড়াই প্রাক-1.17 NumPy এ থাকেন তবে আপনি 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কার্যে একটি যুক্তিও রয়েছে , তবে এ যুক্তিটি অকার্যকরভাবে কার্যকর করা হয়েছিল এবং তারপরে এলোমেলো সংখ্যার স্ট্রিমের স্থায়িত্ব গ্যারান্টিগুলির কারণে অযোগ্য হয়ে পড়েছে, সুতরাং এটির ব্যবহারের প্রস্তাব দেওয়া হয়নি। (এটি মূলত অভ্যন্তরীণভাবে এলোমেলো এবং স্লাইস জিনিস করে does


4
মুদ্রণ এলোমেলো.সাম্পল (পরিসর (20), 10) পাইথন 2.6 নিয়ে কাজ করে না ?!
একাডেমিয়া

সমস্যাটি একটি খারাপ পাইদেব কনফিগারেশনের কারণে হয়েছিল। কথা
একাডেমিয়া

4
আমার এনটি যদি 20 না হয় তবে 1000000 এর মতো হয় তবে এর থেকে আমার কেবল 10 টি অনন্য সংখ্যা প্রয়োজন, সেখানে আরও মেমরির দক্ষ পন্থা রয়েছে?
mrgloom

4
পাইথন 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)
জোশ বোদে

4
নোটটি np.random.choice(a, size, replace=False)বড়দের জন্য খুব ধীর a- আমার মেশিনে, এক = 1 এম এর জন্য প্রায় 30 এমএস।
ম্যাথু রাহ্তজ

4
খুব বড় nব্যবহারের জন্য সময় এবং স্মৃতি সমস্যাগুলি এড়ানোর জন্য numpy.random.Generator.choice(নপি v1.17 দিয়ে শুরু)
বেনবো

4
আমি যে প্রধান অসুবিধাটি দেখতে পাই তা হ'ল এন.পি.আরন্ডম.চয়েসটির একটি অক্ষের প্যারামিটার নেই -> এটি কেবল 1 ডি অ্যারেগুলির জন্য।
মোসফেইদার

3

বছরগুলি পরে, 10000 ^ 2 এর মধ্যে 40000 বেছে নেওয়ার জন্য কিছু সময়সীমা (নম্পি 1.8.1, ইম্যাক 2.7 গিগাহার্টজ):

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 out 2 এর মধ্যে 40000 কেন বেছে নেবেন? বড় বড় স্কিপি.স্পার্স.অরেন্ডম ম্যাট্রিক্স উত্পন্ন করতে - স্কিপি 1.4.1 ব্যবহার করুন np.random.choice( replace=False ), স্লোওউও))

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 তম উপাদান সহ বারবার এলোমেলো করে এগুলি এলোমেলো করুন। এটি একটি এলোমেলো ক্রম উত্পাদন করে যা সদৃশ মান ধারণ করে না।


4
ফলাফল এলোমেলো ক্রমের আরেকটি সম্পত্তি হ'ল এটি বিশেষভাবে এলোমেলো নয়
সোভেন মারনাচ

@ স্পেনমার্নাচ - যদিও বেশিরভাগ কাজের জন্য এটি যথেষ্ট এলোমেলো। যদি তিনি এলোমেলোভাবে চান তবে তিনি ডাবল-এলোমেলো পদ্ধতির ব্যবহার করতে পারেন।
বহুবর্ষীয়

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

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