import math
import numpy as np import random
import matplotlib.pyplot as plt
# Q1 Construit une particule aléatoire entre 0 et L
# Q2 Une particule.
# Q3 Vérifie que la particule ne déborde pas de [0,L].
# Q4 Vérifie que la nouvelle ne chevauche pas les précédentes.
# Q5 Vérifie qu'il y a la place pour cette particule.
# Q6 p = R + (L - 2*R)*np.random.rand(1)
# Q7 Une boucle infinie
# Q8 O(N**2)
# Q9
def placement1D(N:int, R:float, L:float) ->
[np.ndarray]:
def possible(c:np.ndarray) -> bool:
if c[0] < R or c[0] > L - R:
return False for p in res:
if abs(c[0] - p[0]) < 2*R:
return False return True
res = []
while len(res) < N:
p = L * np.random.rand(1) if possible(p):
res.append(p) else:
res = []
return res
1
# Q10 sans tri préalable
def placement1Drapide(N, R, L):
libre = L - 2*N*R
liste_p = [libre*random.random() for k in range(N)]
for i in range(N):
for j in range(N):
if i != j and liste_p[j] >=
liste_p[i]:
liste_p[j] += 2*R liste_p[i] += R
return liste_p
# Q10 avec tri préalable
def placement1DrapideBis(N, R, L):
libre = L - 2*N*R
liste_p = [libre*random.random() for k in range(N)]
liste_p.sort()
for k in range(N):
liste_p[k] += (2*k+1)*R return liste_p
# Q11
# sans tri préalable : quadratique
# avec tri préalable : O(n.ln(n)) def affiche(N, R, L):
liste = placement1DrapideBis(N, R, L) plt.plot([0,L],[0,0], color = 'k') plt.axis('equal')
for p in liste:
c1, c2 = p - 1 , p + 1
plt.plot([c1, c2], [0,0], color = 'r', linewidth = 5)
# Q12
2
def histogramme(N, R, L):
particules = []
for k in range(50000):
particules += placement1DrapideBis(N, R, L)
plt.hist(particules, range = (R, L - R), bins = 20)
histogramme(2, 1, 10)
# les extrémités sont surreprésentées par rapport
# au centre dans un rapport de 3/2
# Q13
def placement(D:int, N:int, R:float, L:float) -
> [np.ndarray]:
quatreR2 = 4*R**2
def possible(c:np.ndarray) -> bool:
for p in res:
if sum((c[i] - p[i])**2 for i in range(D)) < quatreR2:
return False return True
res = []
while len(res) < N:
p = R + (L - 2*R) * np.random.rand(D) if possible(p):
res.append(p) else:
res = []
return res
# Q14 le vecteur vitesse est constant
3