Уровень случайности

1

моя цель состоит в случайном перетасовке массива (от 0 до 9), но каждое число должно появляться в массиве только один раз. У меня есть две (рабочие) идеи, но я хотел бы узнать, сколько раз этот метод random2 повторяется для достижения такого же уровня случайности в массиве, что и в первом методе (random1).

import java.util.Random;

class RandomStuff {

static Random r;
final static int iteraction = 10;

public static void main (String[] args) {
    r = new Random();
    int[] array = new int[10];
    random1(array);
    random2(array, iteraction);
}

static void random1(int[] array) {
    for(int i = 0; i < array.length; i++) pole[i] = -1;

    for(int i = 0; i < array.length; i++) {
        while(true) {
            int y = r.nextInt(10);
            if(!find(array, y)) {
                array[i] = y;
                break;
            }
        }
    }
}

static void random2(int[] array, int iteraction) {
    for(int i = 0; i <= iteraction; i++) {
        int y1 = r.nextInt(array.length);
        int y2 = r.nextInt(array.length);
        int p = array[y1];
        array[y1] = array[y2];
        array[y2] = p;
    }
}

static boolean find(int[] array , int value) {
    for(int i = 0; i < array.length; i++) {
        if(pole[i] == value) return true;
    }
    return false;
}
}

Первый метод (random1) работает с назначением случайных чисел и тестированием, если они уже не находятся в массиве. Который кажется для меня довольно случайным.

Второй метод (random2) работает с заменой двух случайных случайных значений в массиве. Поэтому вопрос в том, сколько раз мне приходится менять два числа в массиве, чтобы достичь такого же уровня случайности. (или какое значение имеет переменная iteraction).

Спасибо за любой ответ.

  • 4
    Возможно, вам следует использовать случайную комбинацию Фишера-Йейтса .
  • 0
    Я не понимаю цели твоей «двойственной случайности» - правильности. Если первый метод назначает случайное число каждому элементу, то какое дополнительное преимущество вы получаете, перетасовывая их во второй функции?
Показать ещё 4 комментария
Теги:
arrays
math
random

2 ответа

1
Лучший ответ

Чтобы ответить на ваш первоначальный вопрос, "сколько раз этот метод random2 повторяется для достижения такого же уровня случайности в массиве, что и в первом методе?"

Ответ таков: он никогда не достигнет такого же уровня случайности.

Для любой позиции, которая была заменена, есть равный шанс, что она прибывает в любую позицию, что означает 10% -ный шанс, что она вернется туда, где она началась.

На каждой итерации 2 числа меняются местами (или ноль, если число заменяется на свою позицию). Это означает, что после 1-й итерации 80% -ый шанс для любой данной позиции никогда не был заменен. После N итераций все еще существует вероятность 0.8 ^ N, что она никогда не менялась местами. Если он был заменен, есть вероятность 10%, что он вернулся туда, где он начался. Таким образом, вероятность того, что любая заданная цифра находится в исходном положении, равна 10% + 0.8 ^ N. Это всегда> 10%, поэтому вы никогда не получите абсолютно равномерного распределения.

Например, для вашего выбора из 10 итераций остается 10,7% шанса на каждую цифру, которую она никогда не двигала, или в общей сложности 19,7% вероятность того, что она будет в исходном положении. Так что десять итераций даже не достаточно близки.

  • 0
    Это тот, кто я искал. Спасибо :)
2

Как насчет назначения случайного числа каждому элементу массива, упорядочить случайные числа в порядке и в этом порядке прочитать элемент массива, назначенный этому случайному числу

0.64342 0
0.95229 1
0.23047 2
0.82793 3
0.19014 4
0.18528 5
0.15684 6
0.99546 7
0.54524 8
0.90612 9

порядок

0.15684 6
0.18528 5
0.19014 4
0.23047 2
0.54524 8
0.64342 0
0.82793 3
0.90612 9
0.95229 1
0.99546 7

числа от 0 до 9 теперь в случайном порядке

  • 0
    Это отличная идея, которую стоит попробовать. Спасибо :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню