bunyk написав:Давайте запам'ятаємо наш елемент в змінну х. Запишемо туди None. Коли ми отримуємо перший елемент, то з ймовірністю 1 замінюємо його на перший. Коли отримуємо другий - то з ймовірністю 0.5 замінюємо його на другий. Коли отримуємо третій - з ймовірністю 1/3 замінюємо на третій.
Коли отримуємо n-тий - з ймовірністю 1/n замінюємо на n-тий...
Проблема в тому, n на практиці - обмежене. Нехай max(n) - максимальне число для типу n і нехай ми можемо генерувати рівномірно розподілене ціле число від 0 до max(n)-1.
При n=max(n) можна ввести нову змінну x2 і спочатку привласнити їй значення max(n)+1-го елементу, потім з ймовірністю 1/2 max(n)+2-го і т.д.
Коли дійдемо до 2*max(n)-го елементу, привласнимо х з ймовірністю 1/2 значення x2, і привласнимо х2 значення 2*max(n)+1-го елементу...
Коли дійдемо до n2*max(n)-го елементу, привласнимо х з ймовірністю 1/n2 значення x2 і т.д.
Таким чином, зможемо охопити max(n)^2 елементів.
Далі можна брати x3, привласнювати йому max(n)^2+1 значення...
Можна створити масив з x, x2, x3, ..., інший - з лічильниками n, n2, n3, ... Для гугола шести елеменів в масиві достатньо (якщо брати тип System.Int64 в .NET).
P.S. Оремо треба прописувати процедуру, коли отримуємо останнє число послідовності.
Тому, можливо, для коректних розрахунків замість max(n) краще взяти max(n)/2.