1

0-x からランダムな整数を生成する方法を探しています。x は実行時に人間のユーザーによって定義されます。ただし、これらの数値の半分は 0 より大きく 5 (0,5) 以下である必要があり、残りの半分は [6,x] のセットに含まれている必要があります。

次のコードは 0 ~ x の数値を生成することを知っています。主な問題は、それらの半分が (0,5] のセットになるようにすることです。

    Math.random() * x;

私はこれをやってくれる人を探しているのではなく、ヒントを探しているだけです。ありがとうございました!

4

3 に答える 3

3

最初にコインを投げて、それに基づいて上限または下限の数値を生成できます。

final Random rnd = new Random();
while (true)
  System.out.println(rnd.nextBoolean()? rnd.nextInt(6) : 6 + rnd.nextInt(x-5));

または、扱いにくいものを使用するMath.random()(範囲の端で問題が発生する可能性があります):

while (true)
  System.out.println(Math.floor(
     math.random() < 0.5 ? (Math.random() * 6) : (6 + (x-5) * Math.random())
  ));

これはヒントとしてのみ考えてください:)

于 2012-10-18T14:44:10.243 に答える
0

私はこれをします:

 double halfX= x / 2.0;
double random = Math.random() * x; 
if( random< halfX ) {
    random = random*5.0/(halfX);
} else {
    random = (random/halfX - 1) * (x-5.0) + 5.0 ;
}

今はいいと思います。これは理解しにくく読みやすいですが、呼び出しごとにランダムへの呼び出しは1つだけです。MarkoTopolnicが指摘した事実とは別に、ユーザーには整数が必要でした...私は四捨五入が分布にどのように作用するかを計算する必要があります。

これは絶対に簡単ではありません...私の頭が痛むので、私が思いつくことができる最高のもの:

double halfX= x / 2.0 + 1.0;
double random = Math.random() * (x+2.0); 
int randomInt;
if( random< halfX ) {
    randomInt = (int) (random*6.0/(halfX)); //truncating, means equal distribution from 0-5
} else {
    randomInt = (int) ((random/halfX - 1.0) * (x-5.0) + 6.0) ; //notice x-5.0, this range before truncation is actually from 6.0 to x+1.0, after truncating it gets to [6;x], as this is integer
}

第二部はわかりませんが...数時間の睡眠でうまくいくでしょう...意図と論理が明確であることを願っています...

于 2012-10-18T14:43:55.380 に答える
0

気になる人のために、Markoのソリューションに基づいて私が思いついたソリューションを次に示します。

このプログラムの別の部分に次のクラスを定義しました。

public class BooleanSource
{
private double probability;

BooleanSource(double p) throws IllegalArgumentException
{
    if(p < 0.0)
        throw new IllegalArgumentException("Probability too small");
    if(p > 1.0)
        throw new IllegalArgumentException("Probability too large");
    probability = p;
}

public boolean occurs()
{
    return (Math.random() < probability);
}
}

それで、私は次のことをしました

    private static void setNumItems(Customer c, int maxItems)
{
            BooleanSource numProb = new BooleanSource(0.5);
            int numItems;

            if(numProb.occurs())
            {
                double num = (Math.random()*4)+1;
                numItems = (int) Math.round(num);
            }
            else
            {
                double num = 5 + (maxItems-5)*Math.random();
                numItems = (int) Math.round(num);
            }

            c.setNumItems(numItems);
}
于 2012-10-18T17:22:29.447 に答える