Как можно написать похожую программу, но без 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 шт):
Без 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() и заменить на свои циферки
Я так понимаю, у вас задание не на сортировку и не на численные вычисления с использованием 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) ]
Практически гарантированно уникальное значение инициализатора при каждом запуске программы.