2012-07-17 25 views
1

我試圖實現Random類的擴展。如何執行Random的擴展?

但是這個功能會有一個功能,你可以得到一個數字後面的步驟。例如:

RandNumb(double min, double max, double step) 
RandNumb(1, 10, 2) = 6 
RandNumb(100, 1000, 500) = 1000 
RandNumb(0.001, 0.1, 0.01) = 0.15 

我的第一個想法是從分鐘得到一個隨機數到最大,並比較,如果這是一個有效的數字(因爲步驟)。如果不是,再次生成另一個號碼。

但我相信這不是一個好的表現。你怎麼看?

+0

爲 「RandNumb(1,10,2)」 不會是1,3,5,7,9的有效值? – Hailton 2012-07-18 00:10:14

+0

哦,是的,你是對的..對不起! – 2012-07-18 04:05:16

回答

2

通過該問題的定義,似乎爲有效值 「RandNumb(1,10,2)」 將是:1,3,5,7,9

在這種情況下。該代碼是這樣:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Random rd = new Random(); 
     for (int i = 0; i < 10; i++) 
     { 
      Console.WriteLine("RandNumb(rd, 1, 10, 2)=" + RandNumb(rd, 1, 10, 2)); 
      Console.WriteLine("RandNumb(rd, 100, 1000, 500)=" + RandNumb(rd, 100, 1000, 500)); 
      Console.WriteLine("RandNumb(rd, 0.001, 0.1, 0.01) =" + RandNumb(rd, 0.001, 0.1, 0.01)); 
     } 
     Console.ReadLine(); 
    } 

    public static double RandNumb(Random rd, double min, double max, double step) 
    { 
     int range = (int)Math.Floor((max - min)/step); 
     int stepCount = rd.Next(0, range + 1); 
     return min + (step * stepCount); 
    } 
} 

而結果是這樣的:

RandNumb(rd, 1, 10, 2)=3 
RandNumb(rd, 100, 1000, 500)=600 
RandNumb(rd, 0.001, 0.1, 0.01) =0,071 
RandNumb(rd, 1, 10, 2)=5 
RandNumb(rd, 100, 1000, 500)=600 
RandNumb(rd, 0.001, 0.1, 0.01) =0,041 
RandNumb(rd, 1, 10, 2)=3 
RandNumb(rd, 100, 1000, 500)=600 
RandNumb(rd, 0.001, 0.1, 0.01) =0,081 
RandNumb(rd, 1, 10, 2)=9 
RandNumb(rd, 100, 1000, 500)=600 
RandNumb(rd, 0.001, 0.1, 0.01) =0,011 
RandNumb(rd, 1, 10, 2)=7 
RandNumb(rd, 100, 1000, 500)=100 
RandNumb(rd, 0.001, 0.1, 0.01) =0,091 
RandNumb(rd, 1, 10, 2)=5 
RandNumb(rd, 100, 1000, 500)=100 
RandNumb(rd, 0.001, 0.1, 0.01) =0,001 
RandNumb(rd, 1, 10, 2)=1 
RandNumb(rd, 100, 1000, 500)=600 
RandNumb(rd, 0.001, 0.1, 0.01) =0,071 
RandNumb(rd, 1, 10, 2)=1 
RandNumb(rd, 100, 1000, 500)=600 
RandNumb(rd, 0.001, 0.1, 0.01) =0,061 
RandNumb(rd, 1, 10, 2)=5 
RandNumb(rd, 100, 1000, 500)=100 
RandNumb(rd, 0.001, 0.1, 0.01) =0,041 
RandNumb(rd, 1, 10, 2)=3 
RandNumb(rd, 100, 1000, 500)=600 
RandNumb(rd, 0.001, 0.1, 0.01) =0,021 
5

只需生成min/stepmax/step之間的數字並將生成的結果乘以step即可。在這種情況下,每個結果都是「有效的」。

在你的解決方案中有什麼不好 - 是有機會永遠得不到「有效」的數字,除以一步。

1

這個怎麼樣作爲一個解決方案:

public static class RandomExtensions 
{ 
    public static double RandNumb(
     this Random @this, 
     double minimum, double maximum, double step) 
    { 
     var lowest = System.Math.Ceiling(minimum/step) * step; 
     var highest = System.Math.Floor(maximum/step) * step; 
     var numbers = (int)(1 + (highest - lowest)/step); 
     var index = @this.Next(0, (int)numbers); 
     return lowest + index * step; 
    } 
} 

我測試對這些代碼LINQPad它似乎工作正常。

var rnd = new Random(); 

rnd.RandNumb(1, 10, 2).Dump(); 
rnd.RandNumb(100, 1000, 500).Dump(); 
rnd.RandNumb(0.001, 0.1, 0.01).Dump(); 
rnd.RandNumb(7, 15, 3).Dump(); 

這是我的輸出的一個示例:

4 
1000 
0.08 
12