Привет, я хочу сгенерировать 100 случайных выборочных данных для x1 и x2 с библиотекой numpy, которые удовлетворяют приведенным ниже условиям. ( 1 < х1 ^ 2 + х2 ^ 2 < 2 )
Угол, очевидно, одинаков между 0 и 2π. Что касается распределения радиуса, вы должны использовать Метод обратного преобразования . См., например, этот ТАК ответ об очень похожей проблеме.
import numpy as np
# Define the number of samples you want to generate
num_samples = 100
# Define the lower and upper bounds for x1 and x2
lower_bound = -2**0.5
upper_bound = 2**0.5
# Initialize an empty array to store the generated samples
samples = np.empty((num_samples, 2))
# Generate random samples until we have num_samples that satisfy the condition
count = 0
while count < num_samples:
# Generate a random pair of values for x1 and x2 within the bounds
x1, x2 = np.random.uniform(lower_bound, upper_bound, 2)
# Check if the condition is satisfied for the pair
if 1 < x1**2 + x2**2 < 2:
# If the condition is satisfied, add the pair to the array
samples[count] = [x1, x2]
count += 1
# Print the generated samples
print(samples)
Признайте, что вектор с компонентами x1 и x2 имеет величину sqrt(x1**2 + x2**2). Вам нужен случайный вектор с величиной от 1 до √2
Вы можете генерировать случайные векторы, нормализовать их так, чтобы их величины были равны 1, а затем умножать их на случайное число от 1 до √2.
import numpy as np
# generate 100 random 2d vectors
vecs = np.random.random((100, 2))
# normalize them to a magnitude of 1
vecs /= np.linalg.norm(vecs, axis=1, keepdims=True)
# generate 100 random magnitudes
mags = np.random.uniform(1, np.sqrt(2), (100, 1))
# multiply unit vectors by random magnitudes
vecs *= mags
# separate into components
x1 = vecs[:, 0]
x2 = vecs[:, 1]
Наконец, давайте удостоверимся, что наше условие выполнено:
v = x1**2 + x2**2
assert ((v >= 1) & (v <= 2)).all()
Попробуйте онлайн!
Что ты уже испробовал?