Java 随机数误差
这段代码有点问题,不确定是什么,我尝试在0.8和1.2之间创建一个随机数,然后可以用它乘以使用这个程序生成的分支的长度Java 随机数误差,java,bluej,Java,Bluej,这段代码有点问题,不确定是什么,我尝试在0.8和1.2之间创建一个随机数,然后可以用它乘以使用这个程序生成的分支的长度 import java.awt.*; import javax.swing.*; import java.util.Random; public class OneFractalTree extends JApplet { final double ONE_DEGREE = Math.PI/180; final double BRANCHANGLE = ONE_
import java.awt.*;
import javax.swing.*;
import java.util.Random;
public class OneFractalTree extends JApplet {
final double ONE_DEGREE = Math.PI/180;
final double BRANCHANGLE = ONE_DEGREE*30;
final double SHRINKFACTOR = .65;
final int START_LENGTH = 75;
//Draws branches
public void drawbranch( Graphics g,
double startx, //coordinates of branch start
double starty,
double length, //length of branch
double angle ) //angle of branch
{
double endx = startx + Math.sin(angle) * length; //Calculates the end coordinates of the branch
double endy = starty + Math.cos(angle) * length;
/**
* The loop draws the branches and continues until the length becomes too small
* i.e. when length is less than 1, length becomes smaller by shrinkfacter every iteration)
*/
if( 1 < length ) {
Random rand = new Random();
int randomNum = rand.nextInt((12 - 8) + 1) + 1;
double randomNumdouble = randomNum / 10;
g.setColor( length < 5 ? Color.green : Color.black ); //Sets color according to length
g.drawLine( (int)startx, (int)starty, (int)endx, (int)endy ); //Coordinates to draw line
drawbranch( g, endx, endy, (length * SHRINKFACTOR) * randomNumdouble, angle - BRANCHANGLE ); //1st branch creation
drawbranch( g, endx, endy, (length * SHRINKFACTOR) * randomNumdouble, angle + BRANCHANGLE ); //2nd branch creation
drawbranch( g, endx, endy, (length * SHRINKFACTOR) * randomNumdouble, angle); //3rd branch creation
}
}
public void paint( Graphics g ) {
Rectangle r = getBounds(); //Finds height of applet viewer
drawbranch( g, r.width/2, r.height, START_LENGTH, Math.PI ); //Calls method to draw branch
}
}
正确的公式是
Random.nextDouble() * (max - min) + min;
但要修复您的代码:
int randomNum = rand.nextInt((12 - 8) + 1) + 1;
double randomNumdouble = randomNum / 10.0; // 10 will be interpreted as an `int`, whereas 10.0 will be a `double`
randomNum/10是整数运算,请尝试使用/10.0或/10f来使用浮点运算
/10的问题是,它将把值下限设置为最接近的整数您声明的int randomNum是一个整数。SorandomNum/10正在生成一个整数值,因为randomNum和10都是整数类型。最后,在不进行任何类型转换的情况下,将int类型结果赋给一个双类型变量。
让它成为双随机数双倍=随机数/10.0为什么不先告诉我们出了什么问题;请尝试使用/10.0;。也可以使用Math.PI/180而不是Math.toRadians1来获取代表一个角度的弧度值,这可能更容易阅读。使用randomNum/10f而不是randomNum/10