我的教授要求我们生成0到0.5之间的随机变量。我写了这段代码:
public class Random_Number_Generator {
double randomGenerator() {
Random generator = new Random();
double num = generator.nextDouble() * (0.5 - 0);
return num;
}
}
但是我的教授说这段代码生成随机数字而非随机变量。这意味着什么?
答案 0 :(得分:2)
显然我误读了帖子;应该记住以下内容。
在该代码中,num
和generators
是本地变量。使用随机对象将随机数字(值)分配给名为num
的变量由generator
变量命名。最后,从方法返回变量 num
中存储的值。
在任何情况下,generator.nextDouble()
都会返回[0,1)
之间的值,因此要获得[0,0.5)
之间的值,只需将其缩放一半:将其除以2,或者完成,将它乘以一半。
上面代码中的- 0
很愚蠢,但“好”,因为(0.5 - 0) == 0.5
。
(另外,最好开始创建一个 Random实例并重新使用它......虽然这个问题在.NET中更为明显。)
答案 1 :(得分: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() + ", ");
}
}
这是一个非常糟糕的解决方案,基本上是一个允许您以一组(随机)概率返回值的类。我仍然不知道这是否是你教授想要的......
答案 2 :(得分:-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;
}