随机数生成器产生巨大的负数

时间:2013-10-31 23:15:49

标签: java random

所以我正在创建一个随机代码,它不一定与此级别的任何内容相关,但我更多地测试了一些想法。因此,由于某种原因,我的代码将随机工作,但在大多数情况下,它会抛出一个随机的负数,通常在-413796084附近。我不知道为什么会这样做,我试图将数字保持在0-50附近。我以为我做得对,但显然我没有。此外,我在Java方面相对较新,如果这有助于解释我所犯的任何错误。

import java.util.Scanner;
import java.util.Random;
class damagecalc {
public static void main(String args[]){
    Scanner input = new Scanner(System.in);
    Random randamage = new Random();
    int totaldmg;

System.out.println("Will you (a) attack, (s) defend, (d) skip your turn, (f)         magic,     (i) use an item?");

    String dmgString = input.next();

    char dmgChar = dmgString.charAt(0);


    if(dmgChar == 'a'){
        for(int finaldmg=50;finaldmg<=50;finaldmg++){
        totaldmg = randamage.nextInt(10);
            }
    totaldmg = randamage.nextInt();
    if(totaldmg >= 50){
        System.out.println("You have defeated the monster!");
    }else{
        System.out.println("Damage Dealt:" + totaldmg);
        }
    }
  }
}

EDIT ---------------------------------------------- -

所以我改变了我的代码并修复了一些东西,现在它每次只吐出0。也许现在弄清楚会更容易一些。但我绝对需要帮助。

这是新代码:

import java.util.Scanner;
import java.util.Random;
class damagecalc {
public static void main(String args[]){
    Scanner input = new Scanner(System.in);
    Random randamage = new Random();
    int totaldmg;

    System.out.println("Will you (a) attack, (s) defend, (d) skip your turn, (f) magic, (i) use an item?");

    String dmgString = input.next();

    char dmgChar = dmgString.charAt(0);


    if(dmgChar == 'a'){
        for(int finaldmg=1;finaldmg<=50;finaldmg++){
            }
        totaldmg = randamage.nextInt(1);
        if(totaldmg >= 50){
            System.out.println("You have defeated the monster!");
        }else{
            System.out.println("Damage Dealt:" + totaldmg);
           }
     }
  }
}

3 个答案:

答案 0 :(得分:1)

totaldmg = randamage.nextInt();

Random.nextInt()可以为int返回任何合法值,包括大量的负值,这可能不是您想要的结果。给nextInt一些整数作为参数,将其约束到所需的范围。

另外,我会看一下这个循环,因为很可能它不符合你的想法。

for(int finaldmg=50;finaldmg<=50;finaldmg++){
    totaldmg = randamage.nextInt(10);
}

循环体仅执行一次,并且在循环之后立即覆盖totaldmg

编辑:如果你想生成0到50之间的数字,你可以直接替换它:

for(int finaldmg=50;finaldmg<=50;finaldmg++){
    totaldmg = randamage.nextInt(10);
}
totaldmg = randamage.nextInt();

用这个:

totaldmg = randamage.nextInt(51);

如果你想知道那个51,那就是排除的上限 - 意味着你将获得至少为零且最多为50的伤害量。

答案 1 :(得分:1)

抱歉,我的第一个答案是c#,已更改。

你想要的是

totaldmg = randamage.nextInt(50);

如果您希望它生成0到50之间,则使用51,因为它是独占的。

或者如果你要在0到10之间进行50 +随机伤害,请使用:

totaldmg = 50 + randamage.nextInt(10);

另一个答案指出循环奇怪,我真的不知道你的目标了什么


大声笑根据你在下面的另一个答案的讨论,并假设你没有找到你的问题的真正答案,如果负数介于0和-50之间,那么只需使用

totaldmg = Math.abs(randamage.NextInt(50));

如果数字仍然是负数且非常消极:

totaldmg = Math.abs(randomage.NextInt(50)) % 50;

糟糕,可怕的修复,但如果它真的是一个错误或其他东西,这在理论上会有同样的好处

答案 2 :(得分:0)

所以我明白了。一个我是一个白痴,我的totaldmg = randamage.nextInt();两次,但是当我拿出其中一个时,我只得到了0。因此,当我将其更改为totaldmg = randamage.nextInt(50)时,它的效果非常好。甜。谢谢大家和我一起工作。你们都是很棒的人。