Bạn cần cân nhắc kết quả của mình. Bạn có thể làm điều đó với một cái gì đó như thế này:
private int[] _distribution = new int[] { 0, 1, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9 };
Random _r = new Random();
public int GetWeightedRandom()
{
return _distribution[_r.Next(0, _distribution.Length)];
}
Nếu tôi biết phạm vi của tôi là nhỏ và nhất quán, tôi sẽ sử dụng bảng - nó tầm thường để biến nó thành lớp riêng.
Để hoàn thành, tôi cũng sẽ thêm lớp này vào. Lớp này mượn từ xử lý hình ảnh và sử dụng chức năng sửa gamma: giá trị từ 0 đến 1 được tăng lên gamma, trả về giá trị từ 0 đến 1 nhưng phân phối nhiều hơn đến mức thấp nếu gamma < 1.0 và nhiều hơn nữa đến mức cao nếu gamma> 1.0.
public class GammaRandom {
double _gamma;
Random _r;
public GammaRandom(double gamma) {
if (gamma <= 0) throw new ArgumentOutOfRangeException("gamma");
_gamma = gamma;
_r = new Random();
}
public int Next(int low, int high) {
if (high <= low) throw new ArgumentOutOfRangeException("high");
double rand = _r.NextDouble();
rand = math.Pow(rand, _gamma);
return (int)((high - low) * rand) + low;
}
}
(từ bình luận, chuyển r ra khỏi GetWeightedRandom(). Ngoài ra bổ sung phạm vi kiểm tra để Tiếp())
OK, chúng ta hãy thực sự đi đến thị trấn ở đây. Tôi đang channeling John skeet cho điều này - nó là một lớp trừu tượng với một thuộc tính template trả về một hàm biến đổi ánh xạ phạm vi [0..1) đến [0..1) và chia tỷ lệ ngẫu nhiên cho phạm vi đó. Tôi cũng reimplemented gamma về nó và thực hiện tội lỗi và cos là tốt.
public abstract class DelegatedRandom
{
private Random _r = new Random();
public int Next(int low, int high)
{
if (high >= low)
throw new ArgumentOutOfRangeException("high");
double rand = _r.NextDouble();
rand = Transform(rand);
if (rand >= 1.0 || rand < 0) throw new Exception("internal error - expected transform to be between 0 and 1");
return (int)((high - low) * rand) + low;
}
protected abstract Func<double, double> Transform { get; }
}
public class SinRandom : DelegatedRandom
{
private static double pihalf = Math.PI/2;
protected override Func<double, double> Transform
{
get { return r => Math.Sin(r * pihalf); }
}
}
public class CosRandom : DelegatedRandom
{
private static double pihalf = Math.PI/2;
protected override Func<double, double> Transform
{
get { return r => Math.Cos(r * pihalf); }
}
}
public class GammaRandom : DelegatedRandom
{
private double _gamma;
public GammaRandom(double gamma)
{
if (gamma <= 0) throw new ArgumentOutOfRangeException("gamma");
_gamma = gamma;
}
protected override Func<double, double> Transform
{
get { return r => Math.Pow(r, _gamma); }
}
}
Vì vậy, bạn đang yêu cầu cho số ngẫu nhiên mà, err, không phải là ngẫu nhiên? – blowdart
Không, anh ta không, anh ta chỉ muốn một bản phân phối khác (giống Gauss hơn 8, không phân bố đều trên tất cả các số) – schnaader
Tôi muốn tạo các số ngẫu nhiên có trọng số. –