01/10/2018, 00:05

Thắc mắc về chương trình tạo mảng các số integer ngẫu nhiên

Em có một bài tập về việc tạo một mảng các số ngẫu nhiên và đếm xem có bao nhiêu số 0 trong mảng đó.
Đây là đoạn code của em:

import java.util.Random;

/**
 * Created by Danh Thai on 9/26/2016.
 */
public class OneSum {
    public static int count(long[] a){
        int count = 0;
        for(int i = 0; i < a.length; i++){
            if(a[i] == 0 ) count ++;
        }
        return count;
    }
    public static void main(String[] args){
        int n = 70;
        long a[] = new long[n];
        final  int MAX= Integer.MAX_VALUE;
        final int MIN = Integer.MIN_VALUE;
        for(int i = 0; i < a.length; i++){
            a[i] = min + (long)((Math.random() * ((max - min) + 1)));
        }
        count(a);
        System.out.println(max - min );
        System.out.println(count(a));
    }

}

LỖI: Theo em lỗi ở đây là khi đặt max và min là 2 giá trị đầu cực của kiểu int thì câu lệnh khởi tạo giá trị a[i] sẽ bị tràn bộ nhớ do max - min có giá trị vượt quá phạm vi của int. Vậy mọi người cho em hỏi có cách nào để tạo một mảng gồm các số int ngẫu nhiên trong phạm vi của integer không ạ?

Đỗ Trung Quân viết 02:05 ngày 01/10/2018

Lý do là vì bị overflow khi bạn trừ max cho min
Bạn có thể sử dụng long sau đó cast ngược lại về kiểu int

Random m_random = new Random();
...
public int randomWithRange(int MIN, int MAX) {
    return (int) ((m_random.nextLong() & Long.MAX_VALUE) % (1L + max - min)) + min;
}
Always a noob viết 02:10 ngày 01/10/2018

Vậy nếu muốn khởi tạo mảng ngẫu nhiên của một kiểu giá trị thì vẫn phải dùng đến kiểu giá trị lớn hơn ạ?

Đỗ Trung Quân viết 02:11 ngày 01/10/2018

vẫn phải dùng đến kiểu giá trị lớn hơn ạ?

Tùy thuộc vào khoảng bạn muốn random

Always a noob viết 02:07 ngày 01/10/2018

À vâng ý em là nếu muốn random trong toàn bộ phạm vi của kiểu thì phải dùng đến kiểu lớn hơn ạ?

Đỗ Trung Quân viết 02:15 ngày 01/10/2018

Bạn có thể random 2 lần. Từ min đến 0 rồi từ 0 đến max. Sau đó lại random 2 kết quả này. Có nhiều cách mà. Do logic của từng người nhé. Try hard

Saber Yii viết 02:10 ngày 01/10/2018

bạn thử dùng cái này xem
random 0 -> n
(int)(Math.random() * (n + 1));

ví dụ 20
(int)(Math.random() * (20 + 1));

Always a noob viết 02:13 ngày 01/10/2018

Hàm này thì em có biết nhưng em muốn random ra cả số âm nữa ạ

Quân viết 02:15 ngày 01/10/2018

nhân random với -1 là được cả số âm thôi

Always a noob viết 02:13 ngày 01/10/2018

Nếu tự ý nhân với -1 thì đâu còn là random nữa ạ. Em muốn số lượng các số âm và dương cũng mang tính ngẫu nhiên thôi ạ

Quân viết 02:16 ngày 01/10/2018

Chán bạn thế nhỉ, random 2 lần, nếu được số chẵn thì là 1 số lẻ thì -1 đem nhân với số random thứ 2 thế là được số random âm đến dương, suy nghĩ linh động lên 1 tý, đừng phụ thuộc framework quá

Always a noob viết 02:16 ngày 01/10/2018

Vâng em cảm ơn em cũng vừa nghĩ được rồi ạ

Bài liên quan
0