2010-12-11 2 views
0

임의의 숫자를 생성하는 장치에서받은 바이트 배열에서 임의의 숫자를 생성해야하는 프로그램을 개발 중입니다. 문제는; 장치는 난수를 바이트 스트림으로 보내고 특정 값 사이의 정수를 생성해야합니다. 즉 :바이트 배열에서 특정 값 사이의 임의의 정수를 생성하는 방법

int GenerateRandom(int min, int max, byte[] rndr) { 
//Do something with the bytes to make a random integer here between min and max 
} 

아니, 사용할 수 없습니다 내장 .NET에서 임의의 클래스, 프로그램이 보안 정보를 암호화하는 데 사용되며, 의사 난수 생성기가되지 않을 것 때문에 허용.

+0

@Mitch : 중복 질문에 대한 링크를 게시 할 수 있습니까? –

+0

C# – IDWMaster

+0

에 대한 구체적인 답변 필요 예를 들어 무엇을 설명 하시겠습니까? –

답변

3

java.util.Random 클래스의 source code이 도움이 될 수 있습니다. 나는 C#이 아니지만 아직 downvote하지 않는다는 것을 안다. 알고리즘은 중요한 비트입니다 : 임의 비트의 소스가 주어지면 0과 n 사이의 정수를 생성하십시오. 범위 [0..n]을 [min..max]로 변환하는 것은 아주 간단합니다.

비슷한 알고리즘으로 C#에서 동일한 알고리즘을 구현할 수 있습니다. 두 개의 닫는 중괄호와 2 줄의 입력 유효성 검사를 포함하여 약 12 ​​줄입니다.

편집 : nextInt(int n) 기능은보고 싶은 기능입니다.

EDIT2 : 또는 RNGCryptoServiceProvider을 고품질 임의 비트로 시드 할 수 있습니다. 그것은 당신의 목적을 위해 충분히 안전 할 수 있습니다. 특히, 새로운, 고품질 임의성으로 모든 것을 자주 다시 시드 할 수 있다면 더욱 그렇습니다.

흥미롭게도 Linux의 Chrome에서는 msdn 웹 사이트가 올바르게 작동하지 않습니다. 누가 펑크했을까요?

+0

그가 정말로 알고리즘을 필요로한다면 이것을 구현하는 것은 C#이 너무 어렵다는 것을 증명해서는 안됩니다. 감사합니다. – ProfK

+0

. 이것은 완벽하게 작동했습니다. Java 알고리즘을 사용했습니다. – IDWMaster

0

암호문이 강한 난수가 필요한 경우 .NET Framework에는 RNGCryptoServiceProvider 클래스가 있습니다.

GetBytes()은 암호화 된 강력한 임의의 값 시퀀스로 바이트 배열을 채 웁니다.

+0

RNGCryptoServiceProvider는 여전히 OP의 임의성 소스만큼 좋지 않습니다. 질문 : "의사 난수 생성기는 용인 될 수 없습니다". RNGCryptoServiceProvider는 여전히 의사 랜덤이지만 바닐라 Random 클래스보다 좋습니다. –

0

이 바이트 배열에 이미 임의의 숫자가 포함 된 경우이를 샘플 값으로 사용할 수 있습니다. 이 예제에서는 처음 4 바이트를 사용하고 있습니다. 적용 가능한 단어 크기에 상관없이이를 수정할 수 있으며 단어를 회전시킬 수 있습니다.

static int GenerateRandom(int min, int max, byte[] rndr) 
{ 
    int isamp = (int)(((uint)rndr[3] << 24) | ((uint)rndr[2] << 16) | ((uint)rndr[1] << 8) | ((uint)rndr[0])); 
    if (isamp < 0) 
     isamp += int.MaxValue; 
    double samp = isamp * 4.6566128752457969E-10; 
    return (int)(samp * (max - min)) + min; 
} 
+0

결과로 출력 간격에서 동일한 값이 나오지는 않습니다. – CodesInChaos

+0

입력 씨드의 분포에 따라 달라집니다. 입력과 똑같이 분산되어 있습니다. – Tergiver

관련 문제