Thuật toán đầu tiên tạo ra các số cách đều nhau
Xem thêm loạt sai lệch thấp .
[0;1]
(Như đã chỉ ra, điều này có thể là một mong muốn ví dụ như tài sản để phân tầng. Loạt thấp nhất quán như Halton và Sobel làm có trường hợp sử dụng của họ.)
Một cách tiếp cận phù hợp nhưng đắt tiền (cho các giá trị thực)
... là sử dụng các số ngẫu nhiên phân phối beta. Thống kê thứ tự xếp hạng của phân phối thống nhất là phân phối beta. Bạn có thể sử dụng điều này để vẽ ngẫu nhiên nhỏ nhất , sau đó nhỏ nhất thứ hai, ... lặp lại.
[0;1]Beta[1,n]n1−X∼Beta[n,1]−ln(1−X)∼Exponential[n]. Chúng tôi có thể lấy mẫu các số ngẫu nhiên từ phân phối này là cho việc này.−ln(U[0;1])n
−ln(1−x)1−xx=−ln(1−u)n=u1n=1−u1n
Which yields the following algorithm:
x = a
for i in range(n, 0, -1):
x += (b-x) * (1 - pow(rand(), 1. / i))
result.append(x)
There may be numerical instabilities involved, and computing pow
and a division for every object may turn out to be slower than sorting.
For integer values you may need to use a different distribution.
Sorting is incredibly cheap, so just use it
But don't bother. Sorting is so ridiculously cheap, so just sort. Over the years, we have well understood how to implement sorting algorithms that sorting doubles is not worth avoiding. Theoretically it's O(nlogn) but the constant term is so ridiculously small in a good implementation that this is the perfect example how useless theoretical complexity results can be. Run a benchmark. Generate 1 million randoms with and without sorting. Run it a few times, and I wouldn't be surprised if quite often the sorting beats the non-sorting, because the cost of sorting will still be much less than your measurement error.
R
. Để tạo một mảng gồm tập hợp số ngẫu nhiên trong một khoảng thống nhất , đoạn mã sau hoạt động : .rand_array <- replicate(k, sort(runif(n, a, b))