Как можно написать похожую программу, но без numpy и random?

import numpy
import random


def selection_sort(a):
    for i in range(len(a) - 1):
        ii = i
        for j in range(i + 1, len(a)):
            if a[j] > a[ii]:
                ii = j
        a[i], a[ii] = a[ii], a[i]


n = random.randint(1, 10000)
k = random.randint(1, 100)
b = list(numpy.random.randint(0, 2 * 10 ^ 9, n))
selection_sort(b)
f = (b[k])
print('Количество элементов =', n, 'Необходимо выбрать', k, 'элемент.')
print('Отсортированный массив b равен', b)
print('Выбранный элемент -', f)

b здесь - это массив, состоящий из n-ного количества элементов, каждый из которых равен 0 ≤ ai ≤ 2 x 10 ^ 9, а k - элемент массива, который нужно выбрать.

Пример работы программы: C:\Users\DX1\PycharmProjects\pythonProject1\venv\Scripts\python.exe C:/Users/DX1/PycharmProjects/pythonProject1/main.py Количество элементов = 5382 Необходимо выбрать 21 элемент. Отсортированный массив b равен [28, 28, 28, 28, 28, 28, 28, 28, 28, ... 1, 1, 1, 1, 1] Выбранный элемент - 28

Process finished with exit code 0


Ответы (2 шт):

Автор решения: K_R_O_K_O_D_I_L_L_O

Без random теоретически можно, но без библиотек очень сложно. ГСЧ не встроен в питон по умолчанию. Для этого нужен модуль random или ГСЧ из функции random_number. Но учтите, решение из модуля random всегда лучше.

Без numpy и random:

import datetime

def random_number(minimum,maximum):
    now = str(datetime.datetime.now())
    rnd = float(now[::-1][:3:])/1000
    return int(minimum + rnd*(maximum-minimum))


def selection_sort(a):
    for i in range(len(a) - 1):
        ii = i
        for j in range(i + 1, len(a)):
            if a[j] > a[ii]:
                ii = j
        a[i], a[ii] = a[ii], a[i]


n = random_number(1, 10000)
k = random_number(1, 100)
b = []
for i in range(n):
    b.append(random_number(0, 2 * 10 ^ 9))
selection_sort(b)
f = b[k]
print('Количество элементов =', n, 'Необходимо выбрать', k, 'элемент.')
print('Отсортированный массив b равен', b)
print('Выбранный элемент -', f)


Но если вы используете фиксированые значения, можете выкинуть random.randint() и заменить на свои циферки
→ Ссылка
Автор решения: Pak Uula

Я так понимаю, у вас задание не на сортировку и не на численные вычисления с использованием numpy, а на генератор псевдослучайных чисел.

Ну так и сделайте себе генератор. Самый простой вариант - регистр сдвига с линейной обратной связью. Если не заморачиваться и взять первую попавшуюся схему из википедии, то может получиться что-то в таком духе:

class LSFR_PRNG:
    def __init__(self, S=0xdeadbeef):
        self.S = S & 0xffffffff
    def next(self):
        bit = (((self.S >> 31) ^ (self.S >> 30) ^ (self.S >> 29) ^ (self.S >> 27) ^ (self.S >> 25) ^ self.S ) & 0x00000001 )
        self.S = (self.S >> 1)| (bit << 31)
        return self.S
    def randint(self, left, right=None):
        if right is None:
            left, right = 0, left
        if left > right:
            left, right = right, left
        rng = right - left
        return left + self.next()%rng

Тогда тот кусок вашей программы, который использует генераторы случайных чисел, можно переписать вот так:

prng = LSFR_PRNG()

n = prng.randint(1, 10000)
k = prng.randint(1, 100)
b = [ prng.randint(2 * 10**9) for _ in range(n) ]

Обратите внимание, что два на десять в девятой степени в языке Python записывается как 2*10**9. А то, что написали вы, это оператор XOR: 2*10^9 == (2*10) XOR 9 == 29

Если вы хотите, чтобы при каждом запуске программы получались разные результаты, то регистр сдвига нужно инициализировать каким-нибудь значением, производным от текущего времени. Например, вот так:

import time

prng = LSFR_PRNG(hash(time.time()))

n = prng.randint(1, 10000)
k = prng.randint(1, 100)
b = [ prng.randint(2 * 10**9) for _ in range(n) ]

Практически гарантированно уникальное значение инициализатора при каждом запуске программы.

→ Ссылка