0

mod 演算子を使用して、ユーザーが事前定義した範囲の間で数値を生成する方法を見つけようとしています。

したくないこと

int min = input.nextInt();
int max = input.nextInt();

Random r = new Random();
int X = r.nextInt(max - min + 1) + min;

私が欲しいのは、従来の int X = gen.nextInt() % 100 + 1; に似たものです。ただし、代わりに最大値と最小値を使用します。

これが私がこれまでに持っているものです

import java.util.*;

public class Modulus
{// begin class
    public static void main(String[] args)
    {// begin  main
    Scanner input;
    int max, min, range;
    Random gen;

    gen = new Random();


    input = new Scanner(System.in);

    System.out.println("Please enter a max value: ");
    max = input.nextInt();
    // Ask user to input max value

    System.out.println(" Please enter a minimum value: ");
    min = input.nextInt();
    // Ask user to input min value

     range = gen.nextInt() % (Unknown) 
    // Get random integer between min and max values using %


    System.out.println(" Your generated number is: " + range );






    } 
//end main
}
//end class

mod オペレーターを使用してこれを達成する方法を誰か説明できますか?

4

2 に答える 2

1

これ

 range = Math.abs(gen.nextInt() % (max - min + 1)) + min 

あなたが望むものを手に入れます。この%演算子は、from 0toが正数または 0 を返す場合、または from max-mintoが負を返す場合、値を返します。したがって、 からまでの範囲の数値が返され、追加するとから までの範囲の数値が得られます。nextInt0-(max-min)nextIntabs0max-minminminmax

ただし、この方法はお勧めしません。M 個の整数のセットからランダムな整数を生成し、%それを N 個の整数のセットに減らすために使用する場合、M が N で割り切れない場合、結果の分布は均一ではありません。結果によっては、他の結果よりも頻繁に表示されるものがあります。 . を使いたくない理由はわかりませんgen.nextInt(max - min + 1)が、この仕事に適したツールです。

編集:このようなことを行う正しい方法は次のようになります: 0 から M-1 までの範囲の乱数を生成する方法があり、0 から N-1 までの範囲の乱数が必要な場合は、 0 から N*(M/N)-1 [M/N は切り捨てられる整数除算] の範囲の数値のみを選択し、ジェネレーターが N*(M/N) から M の範囲の数値を選択する場合-1、ループバックして再試行してください。次に% N、結果に対して演算子を使用すると、均一な分布が得られます。(ジェネレーターが負の値を生成できる場合は、このアルゴリズムを調整する必要があります。) のコードRandom.nextInt(int n)はまさにこれを行います。JREソースからのコメントは次のとおりです。

* The algorithm is slightly tricky.  It rejects values that would result
* in an uneven distribution (due to the fact that 2^31 is not divisible
* by n). The probability of a value being rejected depends on n.  The
* worst case is n=2^30+1, for which the probability of a reject is 1/2,
* and the expected number of iterations before the loop terminates is 2.

したがってnextInt(n)、必要な作業を行うため、それを使用しない唯一の理由は、それが宿題であり、許可されていない場合です。

于 2013-11-08T02:31:27.280 に答える
1

機能を使用できますMath.abs()

すなわち

public static int genRandom(int mod){
  Random r = new Random();
  return Math.abs(r.nextInt()) % mod + 1;
}

高い数値をパラメーターとして接続します。これに対する注意点は、負でない値でのみ機能することです。

于 2013-11-08T02:23:12.500 に答える