Тема: Масив унікальних випадкових чисел
Як задати масив рандомними числами але щоб вонине повторювалися?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Алгоритми та структури даних, технології → Масив унікальних випадкових чисел
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Як задати масив рандомними числами але щоб вонине повторювалися?
Заповнити масив випадково згенерованими числами.
Після чого порівняти кожне число масиву з усіма іншими. Якщо виявлено збіг, замінити одне з чисел новим випадково згенерованим.
Продовжувати, поки після повного проходження масиву не залишиться жодного збігу.
Можна зробити й більш оптимально: порівнювати кожен елемент масиву лише з тими елементами, що йдуть після нього (і в разі збігу замінювати новим значенням той елемент, що ближче до кінця масиву). (Незовсім так — див. нижче)
Якимось чином відстежувати, щоб вони не повторювалися (Козак Окобака).
Загалом залежить від того, які саме числа треба отримувати. Якщо масив більший за діапазон випадкових чисел і вони цілі, то за принципом Діріхле такі числа згенерувати, вочевидь, неможливо.
А втім, ні: в другому «оптимізованому» варіанті може виявитись так, що згенероване нове значення дасть збіг з якимось із елементів, що йдуть перед тим, з яким його порівнювали — отже, згенерувавши випадкове число, його все одно доведеться порівнювати з усіма елементами від першого до того, з яким цей елемент перед цим дав збіг.
Мені не подобаються алгоритми, що покладаються на випадковість у складності.
Придумав алгоритм з O(n), але там числа будуть дещо невипадково розкидані. Кажу ж - питання в тому, наскільки числа мають бути випадкові. Якщо довжина інтервалу випадкових чисел (a;b) суттєво більша за їхню кількість n, то:
генеруємо n+1 число від 0 додаванням випадкового числа від 1 до (b-a)/n до попереднього в проміжний масив t (0 в масив не записуємо);
перші n чисел перетворюємо t[i] = t[i]*(b-a)/t[n]+a;
тасуємо перші n чисел; найпростіше це зробити, витягаючи випадкове за номером число в масив-результат, а на його місце пересуваючи останнє.
А якщо різниця несуттєва, то створюємо масив з усіх можливих варіантів і виконуємо лише п. 3.
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися