Bfrank
Bfrank

Reputation: 33

Need help using random numbers and modulos

I'm trying to make a simple program that will display 20 random numbers between 1 and 100 and then print out which numbers are divisible by 3 and equivalent to 1%3 and 2%3. It seems to work just fine but I've noticed it only works with the very last number in the list. What am I missing to include all the numbers in the search for my math? Thank you in advance for any help I can get!

import java.util.Random;


public class Lab5 {

public static void main(String[] args) {

    Random rnd = new Random();
    int repeat = 19;
    int n = 0;

    for(int i=0;i<=repeat;i++){
        n = rnd.nextInt(100)+1; 
        System.out.print(n+", ");

    }
    System.out.println();
    System.out.println("-------------------------------------");

    if(n % 3 == 0){
        System.out.println("Numbers divisible by three: "+n+(", "));

    }else{
        System.out.println("Numbers divisible by three: NONE");

    }
    System.out.println("-------------------------------------");
    if(n == 1 % 3){
        System.out.println("Numbers equivalent to one modulo three: "+n+(", "));

    }else{
        System.out.println("Numbers equivalent to one modulo three: NONE");
    }

    System.out.println("-------------------------------------");

    if(n == 2 % 3){
     System.out.println("Numbers equivalent to two modulo three: "+n+(", "));

    }else{
        System.out.println("Numbers equivalent to two modulo three: NONE");
    }

}

}

Upvotes: 0

Views: 110

Answers (5)

ErstwhileIII
ErstwhileIII

Reputation: 4863

Well .. you did not calculate anything in the loop, so your print statements work the last value of n after you exited the loop. Try something like

package com.example.modulo;
import java.util.Random;
public class Modulo {
public static void main(String[] args) {

    Random rnd = new Random();
    int repeat = 19;
    int n = 0;

    int[] nMod = new int[3];
    nMod[0] = 0;
    nMod[1] = 0;
    nMod[2] = 0;
    for (int i = 0; i <= repeat; i++) {
        n = rnd.nextInt(100) + 1;
        nMod[n%3] = nMod[n%3] + 1;
        System.out.print(n + " (" + n%3 + "), ");
    }
    System.out.println();
    System.out.println("-------------------------------------");

    System.out.println("Numbers divisible by three: " + nMod[0] + (", "));
    System.out.println("Numbers equivalent to one modulo three: " + nMod[1] + (", "));
    System.out.println("Numbers equivalent to two modulo three: " + nMod[2] + (", "));
}
}

Upvotes: 0

Barranka
Barranka

Reputation: 21047

You are putting all the output statements (System.out.println()) outside your loop, so it only outputs the last value.

Move your output statements so they are inside your loop:

public static void main(String[] args) {
    Random rnd = new Random();
    int repeat = 19;
    int n = 0;
    int[] numbers = new int[3]; // To hold how many numbers have modulo 0, 1 or 2
    for(int i = 0; i <= repeat; i++) {
        n = rnd.nextInt(100)+1; 
        System.out.print(n+", ");
        if(n % 3 == 0) 
            System.out.println("The number " + n + " is divisible by 3");
        else 
            System.out.println("" + n + " modulo 3 = " + n % 3);

        numbers[n % 3]++;
    }
    System.out.println("Numbers divisible by 3: " + numbers[0]);
    System.out.println("Numbers with modulo 3 = 1: " + numbers[1]);
    System.out.println("Numbers with modulo 3 = 2: " + numbers[2]);
}

Upvotes: 1

blueygh2
blueygh2

Reputation: 1538

Your n is declared outside of the loop body, so its value will persist. However, since you are overwriting n in each loop iteration, only the last value of n will persist and will be used by other parts of the program.

As Ypnypn has said, correct your use of modulo, and as Arbiter and deanosaur have suggested, move the rest of the program logic inside the for loop

Upvotes: 2

Arbiter
Arbiter

Reputation: 433

It is only printing the last number because the check if the number is divisible, etc is not in your for loop at the top. Simply copy and paste all of the code below it into your for loop and it should work as you intended.

You also have an error here: if (n == 1 % 3), it is legal but will check if n is equal to the remainder of 1 / 3. I don't think that is what you wanted to achieve, so correct it like this: if (n % 3 == 1) as Ypnypn suggested.

Upvotes: 2

Ypnypn
Ypnypn

Reputation: 931

The correct syntax for modulus is n % 3 == 2. The current code n == 2 % 3 means n == 0, since the order of operations in Java requires that modulus is evaluated before equality.

Upvotes: 1

Related Questions