Hướng dẫn random not repeat python - ngẫu nhiên không lặp lại python

Máy tạo số giả đồng hồ sơ tuyến tính tuyến tính

O [1] Bộ nhớ

O [k] Hoạt động

Vấn đề này có thể được giải quyết với một máy phát điện tuyến tính đơn giản. Điều này yêu cầu chi phí bộ nhớ không đổi [8 số nguyên] và nhiều nhất là tính toán 2*[độ dài chuỗi].

Tất cả các giải pháp khác sử dụng nhiều bộ nhớ hơn và tính toán nhiều hơn! Nếu bạn chỉ cần một vài chuỗi ngẫu nhiên, phương pháp này sẽ rẻ hơn đáng kể. Đối với các phạm vi kích thước N, nếu bạn muốn tạo theo thứ tự N duy nhất ____ ____ 6 chuỗi trở lên, tôi khuyên bạn nên sử dụng giải pháp được chấp nhận bằng các phương thức tích hợp random.sample[range[N],k] vì điều này đã được tối ưu hóa trong Python cho tốc độ.

Mã số

# Return a randomized "range" using a Linear Congruential Generator
# to produce the number sequence. Parameters are the same as for 
# python builtin "range".
#   Memory  -- storage for 8 integers, regardless of parameters.
#   Compute -- at most 2*"maximum" steps required to generate sequence.
#
def random_range[start, stop=None, step=None]:
    import random, math
    # Set a default values the same way "range" does.
    if [stop == None]: start, stop = 0, start
    if [step == None]: step = 1
    # Use a mapping to convert a standard range into the desired range.
    mapping = lambda i: [i*step] + start
    # Compute the number of numbers in this range.
    maximum = [stop - start] // step
    # Seed range with a random integer.
    value = random.randint[0,maximum]
    # 
    # Construct an offset, multiplier, and modulus for a linear
    # congruential generator. These generators are cyclic and
    # non-repeating when they maintain the properties:
    # 
    #   1] "modulus" and "offset" are relatively prime.
    #   2] ["multiplier" - 1] is divisible by all prime factors of "modulus".
    #   3] ["multiplier" - 1] is divisible by 4 if "modulus" is divisible by 4.
    # 
    offset = random.randint[0,maximum] * 2 + 1      # Pick a random odd-valued offset.
    multiplier = 4*[maximum//4] + 1                 # Pick a multiplier 1 greater than a multiple of 4.
    modulus = int[2**math.ceil[math.log2[maximum]]] # Pick a modulus just big enough to generate all numbers [power of 2].
    # Track how many random numbers have been returned.
    found = 0
    while found < maximum:
        # If this is a valid value, yield it in generator fashion.
        if value < maximum:
            found += 1
            yield mapping[value]
        # Calculate the next value in the sequence.
        value = [value*multiplier + offset] % modulus

Cách sử dụng

Việc sử dụng hàm này "Random_range" giống như đối với bất kỳ trình tạo nào [như "phạm vi"]. Một ví dụ:

# Show off random range.
print[]
for v in range[3,6]:
    v = 2**v
    l = list[random_range[v]]
    print["Need",v,"found",len[set[l]],"[min,max]",[min[l],max[l]]]
    print["",l]
    print[]

Kết quả mẫu

Required 8 cycles to generate a sequence of 8 values.
Need 8 found 8 [min,max] [0, 7]
 [1, 0, 7, 6, 5, 4, 3, 2]

Required 16 cycles to generate a sequence of 9 values.
Need 9 found 9 [min,max] [0, 8]
 [3, 5, 8, 7, 2, 6, 0, 1, 4]

Required 16 cycles to generate a sequence of 16 values.
Need 16 found 16 [min,max] [0, 15]
 [5, 14, 11, 8, 3, 2, 13, 1, 0, 6, 9, 4, 7, 12, 10, 15]

Required 32 cycles to generate a sequence of 17 values.
Need 17 found 17 [min,max] [0, 16]
 [12, 6, 16, 15, 10, 3, 14, 5, 11, 13, 0, 1, 4, 8, 7, 2, ...]

Required 32 cycles to generate a sequence of 32 values.
Need 32 found 32 [min,max] [0, 31]
 [19, 15, 1, 6, 10, 7, 0, 28, 23, 24, 31, 17, 22, 20, 9, ...]

Required 64 cycles to generate a sequence of 33 values.
Need 33 found 33 [min,max] [0, 32]
 [11, 13, 0, 8, 2, 9, 27, 6, 29, 16, 15, 10, 3, 14, 5, 24, ...]

Chương trình sau đây tạo ra 10 số nguyên ngẫu nhiên, không lặp lại trong khoảng từ 1 đến 100. Nó tạo ra một số nguyên ngẫu nhiên trong khoảng thời gian đã cho và thêm nó vào danh sách nếu nó không được thêm vào trước đó.

>>> import random
>>> list=[]
>>> for i in range[10]:
          r=random.randint[1,100]
          if r not in list: list.append[r]

>>> list
[13, 53, 25, 95, 64, 87, 27, 93, 74, 60]

Cập nhật vào ngày 30 tháng 3 năm 2019 22:30:22

  • Câu hỏi và câu trả lời liên quan
  • Làm thế nào để Python tạo ra các số ngẫu nhiên?
  • Tạo số giả ngẫu nhiên trong Python
  • Mô -đun Python để tạo các số ngẫu nhiên an toàn
  • Làm thế nào để sử dụng Python Numpy để tạo ra các số ngẫu nhiên?
  • Tạo số ngẫu nhiên trong Arduino
  • Làm thế nào để tạo ra các số ngẫu nhiên lớn trong Java?
  • Làm thế nào để tạo số ngẫu nhiên giữa hai số trong JavaScript?
  • Chương trình Java để tạo số ngẫu nhiên
  • Tạo số nguyên ngẫu nhiên trong Java
  • Làm thế nào để tạo các số ngẫu nhiên bình thường tiêu chuẩn trong r?
  • Tạo số ngẫu nhiên bằng thư viện ngẫu nhiên C ++ 11
  • C# Chương trình để tạo các số ngẫu nhiên an toàn
  • Chương trình Java để tạo chuỗi số ngẫu nhiên
  • Tạo các số ngẫu nhiên an toàn để quản lý bí mật bằng Python
  • Làm thế nào để tạo 5 số ngẫu nhiên trong thủ tục lưu trữ MySQL?

Bài Viết Liên Quan

Chủ Đề