Создавать случайные объекты в java

У меня есть массив, и я хочу заполнить его случайными объектами, но с определенным процентом каждого объекта. Например, у меня есть прямоугольник, круг и цилиндр. Я хочу, чтобы прямоугольник составлял 40% длины массива, а круг и цилиндр - по 30% каждый. Любые идеи?

Этот код будет с вероятностью 40% генерировать прямоугольник и т. д.

 public static void main(String[] args){
     n = UserInput.getInteger();
     Shape[] array = new Shape[n];


            for (int i=0;i<array.length;i++){
            double rnd = Math.random();

            if (rnd<=0.4) {
            array[i] = new Rectangle();
        }


            else if (rnd>0.4 && rnd<=0.7){
            array[i] = new Circle();
        }

            else {
            array[i] = new Cylinder();
      }  

person sarotnem    schedule 24.06.2013    source источник
comment
да, у меня есть идеи, но нужно, чтобы ваш код был виден   -  person Prasad Kharkar    schedule 24.06.2013
comment
Это несколько двусмысленно, вы хотите, чтобы ровно 40% были заполнены Rectangles, или вы хотите, чтобы это было ожидаемое значение?   -  person arshajii    schedule 24.06.2013
comment
Длина массива известна?   -  person akaHuman    schedule 24.06.2013
comment
длина массива будет указана пользователем   -  person sarotnem    schedule 24.06.2013


Ответы (2)


Вы можете сделать что-то вроде

for each v in array,
    x = rand()  // number between 0 and 1, see Math.random()
    if 0 < x < 0.40, then set v to Rectangle;  // 40% chance of this
    if 0.40 < x < 0.70, then set v to Circle;  // 30% chance of this
    otherwise set v to Cylcinder               // 30% chance of this

Конечно, это не гарантирует точные соотношения, а лишь определенные ожидаемые соотношения. Если вы хотите, чтобы ваш массив состоял ровно на 40% из прямоугольников, например, вы можете заполнить 40% его прямоугольниками (и 30% кругами и 30% цилиндрами), а затем использовать

Collections.shuffle(Arrays.asList(array))
person arshajii    schedule 24.06.2013
comment
Но это может не означать, что ровно 40% будет прямоугольником, 30% будет кругом и то же самое для цилиндра. - person akaHuman; 24.06.2013
comment
@sleekFish В этом отношении вопрос неоднозначен; ОП хочет ровно 40% или он хочет, чтобы это было ожидаемое значение? - person arshajii; 24.06.2013
comment
Я хочу ровно 40%. Например, в массиве [10] мне нужно 4 прямоугольника, 3 круга и 3 цилиндра. - person sarotnem; 24.06.2013

Я думаю, вы можете сделать это примерно так:

import java.awt.Rectangle;
import java.awt.Shape;

public Shape[] ArrayRandomizer(int size) {
    List<Shape> list = new ArrayList<Shape>();
    if (size < 10 && size%10 != 0) {
        return null; // array must be divided by 10 without modulo
    }
    else {
        Random random = new Random();
        Shape[] result = new Shape[size];
        for (int r=0; r<4*(size/10); r++) {
            Shape rectangle = new Rectangle(random.nextInt(), random.nextInt(), random.nextInt(), random.nextInt()); // standart awt constructor
            list.add(rectangle);
        }
        for (int cir=0; cir<3*(size/10); cir++) {
            Shape circle = new Circle(random.nextInt(), random.nextInt(), random.nextInt()); // your constructor of circle like Circle(int x, int y, int radius)
            list.add(circle);
        }
        for (int cil=0; cil<3*(size/10); cil++) {
            Shape cilinder = new Cilinder(random.nextInt(), random.nextInt(), random.nextInt(), random.nextInt()); // your constructor of cilinder like Cilinder (int x, int y, int radius, int height)
            list.add(cilinder);
        }
    }
    Shape[] result = list.toArray(new Shape[list.size()]);

    return  result;
}
person Anton Chertash    schedule 24.06.2013
comment
Вероятно, вы захотите ограничить координаты прямоугольников, кругов и цилиндров. Это не принесет много пользы, если фигуры будут за кадром. Нужны ли OP только целые координаты и размеры? - person Eric Jablow; 24.06.2013
comment
Не вдаваясь в подробности генерации псевдослучайных чисел)) - person Anton Chertash; 24.06.2013
comment
Я знаю; нецелые размеры прямоугольников (или даже таких, стороны которых не параллельны осям) приводят к ошибкам дискретизации. Я предполагаю, что я был слишком усерден в своем вопросе. Но ограничение форм важно. nextInt() варьируется от Integer.MIN_VALUE до Integer.MAX_VALUE. - person Eric Jablow; 24.06.2013