2013-03-17 41 views
5

Tôi đang cố gắng tạo một số dựa trên hạt giống trong C#. Vấn đề duy nhất là hạt giống quá lớn để trở thành một int32. Có cách nào tôi có thể sử dụng miễn là hạt giống không?C# Ngẫu nhiên (Dài)

Và có, hạt giống PHẢI là một thời gian dài.

+0

Không giải thích tại sao hạt giống * PHẢI * là 'long'? :) Có vẻ như bạn đang cố gắng làm điều gì đó sai. – J0HN

+0

Tại sao bạn cần một hạt giống dài cho một số giả ngẫu nhiên? – tomsv

+0

@ J0HN Tôi tính toán nơi slimes sinh ra trong minecraft. – user1599078

Trả lời

2

Đây là phiên bản C# Java.Util.Random mà tôi đã chuyển from the Java Specification.

Điều tốt nhất cần làm là viết chương trình Java để tạo một tải số và kiểm tra xem phiên bản C# này có tạo ra cùng một số hay không.

public sealed class JavaRng 
{ 
    public JavaRng(long seed) 
    { 
     _seed = (seed^LARGE_PRIME) & ((1L << 48) - 1); 
    } 

    public int NextInt(int n) 
    { 
     if (n <= 0) 
      throw new ArgumentOutOfRangeException("n", n, "n must be positive"); 

     if ((n & -n) == n) // i.e., n is a power of 2 
      return (int)((n * (long)next(31)) >> 31); 

     int bits, val; 

     do 
     { 
      bits = next(31); 
      val = bits % n; 
     } while (bits - val + (n-1) < 0); 
     return val; 
    } 

    private int next(int bits) 
    { 
     _seed = (_seed*LARGE_PRIME + SMALL_PRIME) & ((1L << 48) - 1); 
     return (int) (((uint)_seed) >> (48 - bits)); 
    } 

    private long _seed; 

    private const long LARGE_PRIME = 0x5DEECE66DL; 
    private const long SMALL_PRIME = 0xBL; 
} 
0

tôi muốn đi cho câu trả lời cung cấp ở đây bởi @Dyppl: Random number in long range, is this the way?

Đặt chức năng này, nơi nó có thể truy cập vào mã mà cần phải tạo ra các số ngẫu nhiên:

long LongRandom(long min, long max, Random rand) 
{ 
    byte[] buf = new byte[8]; 
    rand.NextBytes(buf); 
    long longRand = BitConverter.ToInt64(buf, 0); 
    return (Math.Abs(longRand % (max - min)) + min); 
} 

Sau đó, gọi hàm này như sau:

long r = LongRandom(100000000000000000, 100000000000000050, new Random()); 
+5

Mỗi bình luận trong liên kết (và thử nghiệm bản thân), phương pháp này không hoạt động: "Không hoạt động đúng. LongRandom (long.MinValue, long.MaxValue, new Random()), luôn trả về -9223372036854775808. Trong mọi trường hợp, Toán .Abs() phá hủy một bit, để lại cho bạn 63 bit ngẫu nhiên. Bạn không thể cung cấp số ngẫu nhiên 64 bit nếu bạn chỉ có 63 bit ngẫu nhiên. " –