2012-07-17 8 views
1

난 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

+0

오 그래, 네가 맞아. 미안해! –

답변

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/step에서 max/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 
관련 문제