Các giải pháp trước đây không tối ưu. Độ phức tạp chính xác là trong các cuộc gọi đến RandNum50 và được mô tả chi tiết ở đây , sử dụng làm nguồn bit ngẫu nhiên (như được đề xuất bởi Vor):nlogn+O(1)
if ( rand50() > 25 ) then b = 1 else b = 0 // random bit
Ý tưởng cơ bản là bạn tiết kiệm được rất nhiều bit nếu bạn tạo đồng phục trong khoảng từ đếnvà sau đó sử dụng phân rã cơ sở giai thừa , thay vì tạo ra một chuỗi các đồng phục dao động trong khoảng , rồi , rồi , v.v., . Đây thực sự là, như tôi đã đề cập trong bài viết, chủ đề của một bài báo tôi đã gửi!1n!123n
Nếu bạn không biết cách tạo đồng phục, như được đề xuất trong bài đăng đó, từ một bit ngẫu nhiên, bạn cũng có thể tạo ra một xấp xỉ trực tiếp của đồng phục, theo cách này (tương đương với "thật sự" của Vor, nhưng nhanh hơn):
P = (RandNum50()-1) + (RandNum50()-1)*50^1 + (RandNum50()-1)*50^2 + ...
đi xa như bạn cần phải đi. Điều này đang phát triển trong cơ sở . Sau đó, chỉ cần cắt bớt , tức là, , trong trường hợp của bạn. Giá trị này không hoàn toàn ngẫu nhiên, nhưng nó là thước đo tính đồng nhất thường được sử dụng. Hoặc, như Vor gợi ý, bạn có thể từ chối nếu . Sau đó, với giá trị này, bạn có thể thực hiện mở rộng cơ sở giai thừa như được mô tả trong bài .P50Pn = 100 ! P > nQ=Pmodnn=100!P>n