2

たとえば、乱数を昇順で生成したいのです0, 2, 3, 5 .. 100が、そうではありません2, 0, 5 ..

これは私がこれまでに思いついたものです:

public static int vol=5;    
public static void main(String[] args) {
    int randno = getRandNum();
    vol = vol+randno;   
    System.out.println(getRandNum());
}   
private static  int getRandNum() {
    Random r = new Random();
    for (int i =0; i<10; i++)
    {
        int v=r.nextInt(vol);
        System.out.println("r"+v);
    }
    return vol;
}

上記の目標をどのように達成できますか?

4

3 に答える 3

4
/**
 * Generates random numbers, returning an array of ascending order.
 * @param amount    The amount of numbers to generate.
 * @param max       The maximum value to generate.
 * @return  An array of random integers of the specified length.
 */
public static int[] generateIncreasingRandoms(int amount, int max) {
    int[] randomNumbers = new int[amount];
    Random random = new Random();
    for (int i = 0; i < randomNumbers.length; i++) {
        randomNumbers[i] = random.nextInt(max);
    }
    Arrays.sort(randomNumbers);
    return randomNumbers;
}

次のように使用できます。

// Generates 10 random numbers of value 0 to 100,
// printing them in ascending order
for (int number : generateIncreasingRandoms(10, 100)) {
    System.out.print(number + " ");
}

または、あなたがマイクロ最適化のような人で、並べ替えをしたくない場合は、

/**
 * Generates random numbers, returning an array of ascending order.
 * @param amount    The amount of numbers to generate.
 * @param max       The maximum value to generate.
 * @return  An array of random integers of the specified length.
 */
public static int[] generateIncreasingRandomWithoutSorting(int amount, int max) {
    int[] randomNumbers = new int[amount];
    double delta = max / (float)amount;
    Random random = new Random();
    for (int i = 0; i < randomNumbers.length; i++) {
        randomNumbers[i] = (int)Math.round(i*delta + random.nextDouble() * delta);
    }
    return randomNumbers;
}

使用事例:

// Generates 10 random numbers of value 0 to 100,
// printing them in ascending order
for (int number : generateIncreasingRandomWithoutSorting(10, 100)) {
    System.out.print(number + " ");
}

各数値が 0 から 10、10 から 20、20 から 30 の間である理由は、この使用例では、単純に範囲全体を考慮して最初の試行で 100 を取得すると、最終的には 100 になるためです。 100 の配列全体を使用します。

より制御されているため、このソリューションでは、連続する各数値の範囲を変更するため、求めているもの (「0 から 100 の 10 個の数値を昇順に並べ替え」) を実際に取得することはできません。(並べ替えを必要としない他のソリューションと同様)

于 2013-11-14T07:36:36.183 に答える
2

Ben Barkay の答えは良いですが、1 つのステップで一連の数値を作成したくないが、1 つの数値を次々と取得したい場合は、次のようにすることができます。

private static final int MAX = 5;

private Random rand = new Random();
private int maxRand = 0;

public int getIncreasingRandomNumber() {
    maxRand = rand.nextInt(MAX);
    return maxRand;
}
于 2013-11-14T08:19:33.893 に答える
1

これはどうですか?

public class increasing {
    public static void main (String[] args) { 
        Random r = new Random(); 

        int totalNums = 100; 
        int count = 0;

        int lastVal = 0;
        int currVal = 0;
        while(count < totalNums) { 
            currVal = r.nextInt(200);
            lastVal = lastVal + currVal; 
            System.out.println(lastVal + ",");
            count++;
        }
    }

}
于 2013-11-14T07:49:22.983 に答える