0

これが私の問題です。整数の配列があり、配列要素の 20% をランダムに復元します。Javaにはランダムな値以上の関数がありますか? 私は1つの値だけをテストしました:

Random rand=new Random();
int min=0, max=10;
int valeur = rand.nextInt(max - min + 1) + min;
4

6 に答える 6

2

ランダムだが異なる値を取得する最も簡単な方法は、シャッフルを使用することです。

List<Integer> list = new ArrayList<>();
for(int i = min; i <= max; i++) list.add(i);
Collections.shuffle(list);

反復しlistて、ランダムな順序で一意の番号を取得できます。

リストに必要な数を追加することで、何かを 2 つ以上、他の何かを 3 つ以下にしたい場合は、このアプローチを使用することもできます。

ところで:このアプローチは n 個の数値に対して O(n) ですが、乱数を生成し、それらが既に存在するかどうかを確認するのは O(n^2 * log(n)) であり、はるかに低速です。

于 2012-08-01T14:49:54.050 に答える
1

私があなたの質問を正しく理解していれば、あなたは「ランダムな」配列を取得しようとしています。その場合は、次を使用できます。

int nrOfValues = 20;
int[] values = new int[nrOfValues];
for(int i = 0; i < values.length; i++)
{
    values[i] = rand.nextInt(max - min + 1) + min;
}

個別のランダム値を取得したい場合は、次のことを試してください。

ArrayList<Integer> values = new ArrayList<Integer>();
int nrOfValues = 20;
for(int i = 0; i < values.length; i++)
{
    int value = rand.nextInt(max - min + 1) + min;
    while(values.contains(value))
        value = rand.nextInt(max - min + 1) + min;
    values.add(value);
}

もちろん、との選択を誤ると、無限ループに陥る可能性がありますmin...max

于 2012-08-01T14:14:36.427 に答える
1

これにより、数値が 2 回使用されるのを防ぎ、20% を取得します。

    int[] nums = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    Random random = new Random();

    int numsFound = 0;
    int twentyPercent = (int)(nums.length/5F);
    List<Integer> usedIndices = new ArrayList<Integer>();
    while (numsFound < twentyPercent) {
        int index = random.nextInt(nums.length);

        if (!usedIndices.contains(index)) { // not already used?
            System.out.println(nums[index]);
            usedIndices.add(index);
            numsFound++;
        }
    }
于 2012-08-01T14:17:49.293 に答える
0
private Integer[] recover(double percentage, Integer[] ints) {
    int numberOfElementsToRecover = (int) (ints.length*percentage);
    List<Integer> list = Arrays.asList(ints);
    Collections.shuffle(list);
    return Arrays.copyOfRange(list.toArray(new Integer[]{}), 0, numberOfElementsToRecover);
}
于 2012-08-01T16:12:58.590 に答える
0

これを試して。

import java.util.Random;
public class Dice 
{
    public static void main(String[] args)
    {
        // Initialize Variables and Array
        Random rand = new Random();
        int[] numbers = new int[10];
        int min = 0, max = 10;


        // Input Random Number Into 10 Elements Of Array
        for (int i = 0; i < numbers.length; i++)
            numbers[i] = rand.nextInt(max - min + 1) + min;


        // Output 10 Array Cells
        for (int i = 0; i < numbers.length; i++)
            System.out.println(numbers[i]);
    }
}
于 2012-08-01T14:16:59.480 に答える
0

質問がよくわかりませんでした..

私が理解したことから、あなたはこのようなものが必要です

List<Integer> listOfRandomNumbers = new ArrayList<Integer>();
//Initialize this List with required numbers

int numberOfRandomNumbersNeeded = listOfRandomNumbers/5;
int min = 0; 
int max = listOfRandomNumbers.size() - 1;

Random rand = new Random();
Set<Integer> randomNumbers = new HashSet<Integer>();
while(randomNumbers.size() < numberOfRandomNumbersNeeded) {
int value = rand.nextInt(max - min + 1) + min;
randomNumbers.add(listOfRandomNumbers.get(value));
}

System.out.println(randomNumbers);
于 2012-08-01T14:19:29.957 に答える