2010-09-14 87 views
15

Tôi không chắc chắn về cách tạo số nguyên n chữ số ngẫu nhiên trong Java bằng cách sử dụng lớp BigInteger.Làm cách nào để tạo một số nguyên n chữ số ngẫu nhiên trong Java bằng lớp BigInteger?

+0

Hm ... cách tốt nhất là xây dựng nó từ các số 32 bit hoặc 64 bit hoàn toàn ngẫu nhiên. Không chắc liệu API có cho phép điều đó không. –

+0

Mmm ... Tôi chưa bao giờ làm điều đó, nhưng tôi tin rằng seanizer đã đưa ra một giải pháp tốt hơn so với tôi. Bạn nên chấp nhận câu trả lời của mình thay thế. Tôi cho rằng khi bạn nói "5000 chữ số", bạn có nghĩa là chữ số đầu tiên không phải là 0 và câu trả lời của tôi không tuân thủ điều này. –

Trả lời

11
private static Random rnd = new Random(); 

public static String getRandomNumber(int digCount) { 
    StringBuilder sb = new StringBuilder(digCount); 
    for(int i=0; i < digCount; i++) 
     sb.append((char)('0' + rnd.nextInt(10))); 
    return sb.toString(); 
} 

Và sau đó bạn có thể sử dụng nó:

new BigInteger(getRandomNumber(10000)) 
+0

không xấu, bạn cần một trường hợp đặc biệt cho chữ số đầu tiên mặc dù –

+0

@seanizer: nếu chúng tôi muốn phân phối đồng đều trên phạm vi 1x..x - 9..9 thì bạn đã đúng. Tôi giả định một phân bố đồng đều trên phạm vi hoàn chỉnh. 1 trên câu trả lời của bạn anyway :) –

+0

Vì một lý do nào đó đôi khi tôi có độ dài 17 thay vì 18 –

3

Cách đơn giản nhất có thể là điền vào một mảng char [] với 5000 chữ số ngẫu nhiên, chuyển đổi thành chuỗi, sau đó gọi hàm tạo BigInteger(String).

Nếu bất kỳ bước nào trong số đó cung cấp cho bạn sự cố, vui lòng cung cấp thêm chi tiết.

Ngoài ra, bạn có thể làm điều gì đó như thế này:

Random rng = new Random(); // But use one instance throughout your app 
BigInteger current = BigInteger.ZERO; 
for (int i = 0; i < 5000; i++) { 
    BigInteger nextDigit = BigInteger.valueOf(rng.nextInt(10)); 
    current = current.multiply(BigInteger.TEN).add(nextDigit); 
} 

tôi nghi ngờ đó sẽ là khá kém hiệu quả mặc dù.

Bạn có thể giảm số bước cần thiết bằng cách tạo chín chữ số ngẫu nhiên cùng một lúc, với rng.nextInt(1000000000).

+1

Lưu ý rằng điều này sẽ cung cấp cho bạn phân phối ngẫu nhiên trong khoảng từ 1 đến 10^5000, do đó một số số được tạo bởi số này sẽ không dài 5000 chữ số. Nếu cần phân phối đồng đều trong tất cả 5000 chữ số, thì chữ số đầu tiên sẽ được tạo thành một trường hợp đặc biệt được chọn bởi rng.nextInt (9) +1. – oksayt

+1

@oksayt: Vâng, tôi gần như đã đề cập rằng ... sau đó quyết định không quá cầu kỳ;) –

+0

int i; char [] num = new char [5000]; Random R = new Random(); cho (i = 0; i <5000; i ++) { int j = R.nextInt (10) + 1; num [i] = (char) j; } Chuỗi s = num.toString(); BigInteger n = new BigInteger (s); – makaveli2178

0

Đi một chuỗi với 5000 chữ số trong nó sau đó chuyển đổi nó thành BigInteger.

5

Theo các tài liệu, có một nhà xây dựng để làm những gì bạn muốn trong java 6: BigInteger(int, java.util.Random)

Để đó, bạn chỉ cần thêm một lựa chọn ngẫu nhiên 5000 chữ số-tức là. Sử dụng hàm tạo rng cho 4999 chữ số, thêm số cuối cùng vào qua một quá trình ngẫu nhiên riêng biệt. Trên thực tế, vì bạn chỉ muốn lấy mẫu hiệu suất cho các giá trị lớn, bạn có thể tạo ra các bit, và tack một bit vào cuối lớn, chứ không phải là slave để ký hiệu thập phân.

+0

Điều đó cho phép một số * bit * thay vì * chữ số *, điều này sẽ làm cho nó ít nhất * hơi * khó sử dụng nếu OP muốn phân phối ngẫu nhiên trên 5000 chữ số .. về cơ bản tạo ra một giá trị ngẫu nhiên có thể quá lớn và sau đó lặp lại cho đến khi một hợp lý đi kèm. –

+0

@Jon: xem chỉnh sửa; nếu op là linh hoạt về những gì "kích thước" có nghĩa là cho câu hỏi của mình, 5000 bit (một như vậy) có thể chỉ là tốt như 5000 chữ số. Ngoài ra, điện thoại của tôi hút để trả lời các câu hỏi. – Carl

+0

Có Tôi muốn các chữ số không phải là bit. Tôi đã sử dụng hàm tạo mà bạn đã đề cập và sau đó nhận ra rằng nó chỉ cung cấp số từ 0 đến 2^numbits - 1, không phải là số nguyên 5000 DIGIT – makaveli2178

2

Dưới đây là hai phiên bản, một mất một ngẫu nhiên như tham số (trong trường hợp bạn muốn tái sử dụng nó):

public static BigInteger getRandomNumber(final int digCount){ 
    return getRandomNumber(digCount, new Random()); 
} 

public static BigInteger getRandomNumber(final int digCount, Random rnd){ 
    final char[] ch = new char[digCount]; 
    for(int i = 0; i < digCount; i++){ 
     ch[i] = 
      (char) ('0' + (i == 0 ? rnd.nextInt(9) + 1 : rnd.nextInt(10))); 
    } 
    return new BigInteger(new String(ch)); 
} 

Các kết quả BigInteger sẽ luôn luôn có chiều dài quy định.

1

Nếu n là giữa 1 đến 12 sau đó phương pháp sau đây sẽ giúp

private String getRandom(int length) { 
    if (length < 1 && length > 12) { 
     throw new IllegalArgumentException("Random number generator length should be between 1 to 12"); 
    } 
    long nextLong = Math.abs(random.nextLong()); 
    return String.valueOf(nextLong).substring(0, length); 
} 

hơn Một điều cần lưu ý là nó cũng không phải là kiểm tra mã.

Các vấn đề liên quan