문제
두 값 사이에 임의의 부동 소수점 숫자를 생성하고 싶습니다.C#에서 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?
해결책
내가 추가하고 싶은 유일한 것은 에릭의 답변은 설명입니다.나는 어떤 코드가 작동하는지 아는 것보다 코드가 작동하는 이유를 아는 것이 더 낫다고 생각합니다.
설명은 이렇습니다.2.5에서 4.5 사이의 숫자를 원한다고 가정해 보겠습니다.범위는 2.0(4.5 - 2.5)입니다. NextDouble
0에서 1.0 사이의 숫자만 반환하지만, 여기에 범위를 곱하면 0에서 1.0 사이의 숫자를 얻게 됩니다. 범위.
따라서 이는 0.0과 2.0 사이의 임의의 double을 제공합니다.
rng.NextDouble() * 2.0
하지만 우리는 2.5에서 4.5 사이를 원합니다!어떻게 해야 할까요?가장 작은 숫자인 2.5를 추가합니다.
2.5 + rng.NextDouble() * 2.0
이제 0.0에서 2.0 사이의 숫자를 얻습니다.이러한 각 값에 2.5를 추가하면 이제 범위가 2.5에서 4.5 사이임을 알 수 있습니다.
처음에는 b > a인지 a > b인지가 중요하다고 생각했습니다. 그러나 두 가지 방법을 모두 사용하면 사용된 변수의 순서를 엉망으로 만들지 않는 한 동일하게 작동한다는 것을 알게 될 것입니다.나는 혼동되지 않도록 더 긴 변수 이름으로 표현하는 것을 좋아합니다.
double NextDouble(Random rng, double min, double max) { return min + (rng.NextDouble() * (max - min)); }
다른 팁
System.Random r = new System.Random();
double rnd( double a, double b )
{
return a + r.NextDouble()*(b-a);
}
// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);
복식의 경우 Next를 NextDouble로 바꿀 수 있습니다.
다음은 Cryographically 안전한 난수를 얻는 방법에 대한 스니펫입니다.그러면 암호학적으로 강력한 무작위 값 시퀀스로 8바이트가 채워집니다.
byte[] salt = new byte[8];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(salt);
자세한 내용은 다음을 참조하세요. 당신의 랜덤은 얼마나 랜덤인가요??" (데크 셔플링에 관한 CodingHorror 기사에서 영감을 얻었습니다)
얼마나 무작위입니까?의사 난수를 처리할 수 있다면 간단히 다음과 같이 하십시오.
Random randNum = new Random();
randNum. NextDouble(Min, Max);
"더 나은" 난수를 원한다면 Mersenne Twister 알고리즘을 살펴봐야 할 것입니다.많은 사람들이 있었어 이미 구현했어 그래도 당신을 위해
Longhorn이 왜 그렇게 많이 다운모드되었는지에 대한 설명: http://msdn.microsoft.com/en-us/magazine/cc163367.aspx NextDouble의 구현과 Random Double이 무엇인지에 대한 설명을 찾아보세요.
해당 링크는 또한 비트 스트림 대신 실제 유용한 출력에만 암호화 난수(예: Sameer 언급)를 사용하는 방법에 대한 좋은 예입니다.