-3

私の教授は、0 から 0.5 の間の確率変数を生成するように私たちに依頼しました。私はこのコードを書きました:

public class Random_Number_Generator {

  double randomGenerator()  {
    Random generator = new Random();
    double num = generator.nextDouble() * (0.5 - 0);   
    return num;
  }
}

しかし、私の教授は、このコードはランダム変数ではなく乱数生成していると言っています。これはどういう意味ですか?

4

3 に答える 3

2

どうやら私は投稿を読み違えたようです。以下はそれを念頭に置いて読む必要があります。


そのコードでは、numgeneratorsはローカル変数です変数によって名前が付けられた Randomオブジェクトを使用して、呼び出された変数に乱数() が割り当てられます。最後に、変数に格納されているがメソッドから返されます。numgenerator num

いずれにせよ、generator.nextDouble()は の間の値を返す[0,1)ので、 の間の値を取得するには[0,0.5)、それを半分にスケ​​ーリングします: 2 で割るか、完了したように、半分で乗算します。

上記- 0のコードの はばかげていますが、「大丈夫」です(0.5 - 0) == 0.5


(また、 1 つのRandom インスタンスを作成して再利用することを実践することをお勧めします..この問題は .NET でより明白です。)

于 2012-09-13T07:02:45.607 に答える
1

さて、実際の確率変数は、私の知る限り、確率にマッピングする関数です。私はあなたが関数を返すことになっているとは思わないので、私はこれをスクラッチしました: あなたがすべきだと私が推測することに最も近いこと:

import java.util.*;
import java.lang.*;

class RandomVar
{
    TreeMap<Double, Integer> variables;

    public RandomVar()
    {
        variables = new TreeMap<Double, Integer>();

        int count = Main.RandGen.nextInt(15);
        double probabilityLeft = 1.0;
        for (int i = 0 ; i < count - 1; i++)
        {
            int toPut = Main.RandGen.nextInt(100);
            while (variables.containsValue(toPut)) toPut = Main.RandGen.nextInt(100);
            double prob = probabilityLeft * Main.RandGen.nextDouble();
            variables.put(prob, toPut);
        }
        int toPut = Main.RandGen.nextInt(100);
        while (variables.containsValue(toPut)) toPut = Main.RandGen.nextInt(100);
        double prob = probabilityLeft;
        variables.put(prob, toPut);
    }

    public int getValue()
    {
        double rand = Main.RandGen.nextDouble();
        double sum = 0;
        for (double prob : variables.keySet()) //keySet() is sorted ascending
        {
            if (prob >= rand)
                return variables.get(prob);
        }
        return variables.get(variables.lastKey());
    }

    //Shows probabilities of values
    public void test()
    {
        for (double key : variables.keySet())
            System.out.println(key + " :: " + variables.get(key));
    }
}

class Main
{
    public static Random RandGen = new Random();    

    public static void main (String[] args)
    {
        RandomVar rv = new RandomVar();
        rv.test();
        System.out.println("------------------------------");
        for (int i = 0; i < 40 ; i++)
            System.out.print(rv.getValue() + ", ");
    }
}

これは非常にお粗末なソリューションであり、基本的に、設定された (ランダムな) 確率で値を返すことができるクラスです。これがあなたの教授の望みかどうかはまだわかりませんが...

于 2012-09-13T08:58:08.670 に答える
-1

このコードを試してください:

public static void main(String[] arg) {
    System.out.print(Random());
}

public static double Random() {
    double START = 0;
    double END = 0.5;
    Random random = new Random();
    double token = RandomNumber(START, END, random);
    return token;
}

public static double RandomNumber(double aStart, double aEnd, Random aRandom) {
    if (aStart > aEnd) {
        throw new IllegalArgumentException("Start cannot exceed End.");
    }
    // get the range, casting to long to avoid overflow problems
    double range = aEnd - aStart;
    // compute a fraction of the range, 0 <= frac < range
    double fraction =  (range * aRandom.nextDouble());
    double randomNumber =  (fraction + aStart);
    return randomNumber;
}
于 2012-09-13T07:32:53.190 に答える