문제

두 값 사이에 임의의 부동 소수점 숫자를 생성하고 싶습니다.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 언급)를 사용하는 방법에 대한 좋은 예입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top