अजगर में विशिष्ट लंबाई के साथ यादृच्छिक संख्या कैसे उत्पन्न करें


105

मान लीजिए कि मुझे 3 अंकों की संख्या चाहिए, तो यह कुछ इस तरह होगी:

>>> random(3)
563

or

>>> random(5)
26748
>> random(2)
56

जवाबों:


182

एक यादृच्छिक 3-अंकीय संख्या प्राप्त करने के लिए:

from random import randint
randint(100, 999)  # randint is inclusive at both ends

(यह मानकर कि आपके पास "तीन अंकों तक" के बजाय वास्तव में तीन अंक हैं।)

अंकों की एक मनमानी संख्या का उपयोग करने के लिए:

from random import randint

def random_with_N_digits(n):
    range_start = 10**(n-1)
    range_end = (10**n)-1
    return randint(range_start, range_end)

print random_with_N_digits(2)
print random_with_N_digits(3)
print random_with_N_digits(4)

आउटपुट:

33
124
5127

7
इस समाधान के साथ, आप अपने यादृच्छिक पूल से 10 ** (n-1) संख्याओं को समाप्त कर देंगे
निकु सूरुदे

5
@ निकोलासुरदु: हां, इसीलिए मैंने कहा कि "तीन अंकों तक" के बजाय वास्तव में आपका मतलब तीन अंकों से है।
रिचीहिंडल

3
037 यह 3 अंकों की संख्या है, 100 :) से छोटा है। मेरा मतलब यही था। लेकिन हाँ, एक गैर-लॉटरी आवेदन के लिए, आपका समाधान अभी ठीक है;)
निकु सर्डु

@ निकोलासुरडू यह स्निपेट आपको 037 का परिणाम कैसे दे सकता है ??? यह (१००० से १०००)
रैंडम है

3
@ मोल्दोवन शीर्ष से पढ़ें :)। मेरा मतलब था कि मैं उस संख्या को चाहता था और यह समाधान आपको अंकों की उस संख्या तक नहीं देगा, बल्कि उस संख्या के बिल्कुल अंकों की संख्या देगा। यह मेरा बुरा था, मैंने कोष्ठक में खंड को याद किया।
निकु सूरदु Nic

41

यदि आप इसे एक स्ट्रिंग के रूप में चाहते हैं (उदाहरण के लिए, 10-अंकीय फ़ोन नंबर) तो आप इसका उपयोग कर सकते हैं:

n = 10
''.join(["{}".format(randint(0, 9)) for num in range(0, n)])

'' .जोइन (str (रैंडिन्ट (0, 9)) _ में रेंज (n) के लिए
माइक फॉगल

13

यदि आपको 3 अंकों की संख्या चाहिए और 001-099 मान्य नंबर चाहिए, तो आपको अभी भी रैंडरेंज / रैंडिंट का उपयोग करना चाहिए क्योंकि यह विकल्पों की तुलना में तेज है। स्ट्रिंग में कनवर्ट करते समय बस नेक्सेसरी पूर्ववर्ती शून्य जोड़ें।

import random
num = random.randrange(1, 10**3)
# using format
num_with_zeros = '{:03}'.format(num)
# using string's zfill
num_with_zeros = str(num).zfill(3)

वैकल्पिक रूप से यदि आप यादृच्छिक संख्या को एक इंट के रूप में सहेजना नहीं चाहते हैं, तो आप इसे एक ऑनलाइनर के रूप में कर सकते हैं:

'{:03}'.format(random.randrange(1, 10**3))

अजगर 3.6+ केवल ऑनलाइनर:

f'{random.randrange(1, 10**3):03}'

ऊपर के उदाहरण आउटपुट हैं:

  • '026'
  • '255'
  • '512'

एक समारोह के रूप में लागू:

import random

def n_len_rand(len_, floor=1):
    top = 10**len_
    if floor > top:
        raise ValueError(f"Floor {floor} must be less than requested top {top}")
    return f'{random.randrange(floor, top):0{len_}}'

5

क्या 0 पहले संभावित अंक के रूप में गिना जाता है? यदि हां, तो आपको जरूरत है random.randint(0,10**n-1)। हैं, तो नहीं random.randint(10**(n-1),10**n-1)। और यदि शून्य की अनुमति कभी नहीं है , तो आपको स्पष्ट रूप से उन में शून्य के साथ संख्याओं को अस्वीकार करना होगा, या n random.randint(1,9)संख्याओं को आकर्षित करना होगा ।

एक तरफ: यह दिलचस्प है कि randint(a,b)यादृच्छिक संख्या प्राप्त करने के लिए कुछ गैर-पाइथोनिक "इंडेक्सिंग" का उपयोग करता है a <= n <= b। किसी ने उम्मीद की होगी कि वह काम करेगा range, और एक यादृच्छिक संख्या का उत्पादन करेगा a <= n < b। (बंद ऊपरी अंतराल पर ध्यान दें।)

के बारे में टिप्पणियों में प्रतिक्रियाओं को देखते हुए randrange, ध्यान दें कि इन्हें क्लीनर से बदला जा सकता है random.randrange(0,10**n), random.randrange(10**(n-1),10**n)और random.randrange(1,10)


@ और: a <= n <= bमुझे भी हैरान कर दिया। मैं -1अपने कोड में उस अतिरिक्त को रखने से नाराज था । :-)
रिचीहिंडल

1
@ और - मजेदार रूप से पर्याप्त, randintवास्तव में सिर्फ कॉल के लिए (यह Lib / random.py में है) पायथन कोड randrange(a, b+1)!
डैनियल जी

4

आप अपने आप को थोड़ा सा कार्य करने के लिए लिख सकते हैं जो आप चाहते हैं:

import random
def randomDigits(digits):
    lower = 10**(digits-1)
    upper = 10**digits - 1
    return random.randint(lower, upper)

मूल रूप से, 10**(digits-1)आपको सबसे छोटा {अंक} -digit नंबर 10**digits - 1देता है , और आपको सबसे बड़ा {अंक} -digit नंबर देता है (जो सबसे छोटा {अंक + 1} -digit संख्या शून्य से 1 होता है!)। फिर हम उस सीमा से एक यादृच्छिक पूर्णांक लेते हैं।


0

मुझे वास्तव में रिचीहिंडल का जवाब पसंद आया, हालांकि मुझे अभ्यास के रूप में सवाल पसंद आया। यहाँ स्ट्रिंग्स का उपयोग कर एक क्रूर बल कार्यान्वयन है :)

import random
first = random.randint(1,9)
first = str(first)
n = 5

nrs = [str(random.randrange(10)) for i in range(n-1)]
for i in range(len(nrs))    :
    first += str(nrs[i])

print str(first)

0

से आधिकारिक दस्तावेज है, ऐसा नहीं प्रतीत होता है नमूना () विधि इस उद्देश्य के लिए उचित है?

import random

def random_digits(n):
    num = range(0, 10)
    lst = random.sample(num, n)
    print str(lst).strip('[]')

आउटपुट:

>>>random_digits(5)
2, 5, 1, 0, 4

0

आप एक फंक्शन बना सकते हैं, जो इंट की सूची का उपभोग करता है, स्ट्रिंग में कंसट्रेट में रूपांतरित करता है और कास्ट फिर से इंट करता है, कुछ इस तरह है:

import random

def generate_random_number(length):
    return int(''.join([str(random.randint(0,10)) for _ in range(length)]))

इसकी एक विशेष लंबाई की संख्या उत्पन्न नहीं :(
प्रोमेथियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.