문제

어떻게 Random C#의 클래스?

도움이 되었습니까?

해결책

이것은 트릭을 수행해야합니다. (정상이라고 부르는 것처럼 호출 할 수 있도록 확장 방법입니다. Next 또는 NextDouble a Random 물체).

public static Int64 NextInt64(this Random rnd)
{
    var buffer = new byte[sizeof(Int64)];
    rnd.NextBytes(buffer);
    return BitConverter.ToInt64(buffer, 0);
}

그냥 교체하십시오 Int64 ~와 함께 UInt64 서명되지 않은 정수를 대신 원한다면 어디서나 모든 것이 잘 작동해야합니다.

메모: 보안 또는 생성 된 숫자의 원하는 무작위성에 관한 컨텍스트가 제공되지 않았기 때문에 (실제로 OP는 Random 클래스), 내 예제는 단순히 그것을 처리합니다 Random 클래스, 이것은 무작위성 (종종 정량화 될 때 선호되는 솔루션입니다. 정보 엔트로피)는 문제가되지 않습니다. 관심있는 문제로, 언급 한 다른 답변을 참조하십시오. RNGCryptoServiceProvider (RNG가 제공 한 RNG System.Security 거의 동일하게 사용할 수있는 네임 스페이스).

다른 팁

사용 Random.NextBytes() 그리고 BitConverter.ToInt64 / BitConverter.ToUInt64.

// Assume rng refers to an instance of System.Random
byte[] bytes = new byte[8];
rng.NextBytes(bytes);
long int64 = BitConverter.ToInt64(bytes, 0);
ulong uint64 = BitConverter.ToUInt64(bytes, 0);

사용하십시오 Random.Next() 두 번, 하나의 값을 이동 한 다음 Oring/Adding은 작동하지 않습니다. Random.Next() 비 음성 정수 만 생성하고, 즉 32 개가 아닌 31 비트를 생성하므로 두 호출의 결과는 전체 범위를 다루는 데 필요한 64 비트 대신 62 비트 만 생성합니다. Int64/UInt64. (Guffa의 대답 어떻게 해야하는지 보여줍니다 전화 Random.Next() 그렇지만.)

여기로 간다, 이것은 그것을 사용한다 Crytpo 서비스 (임의의 클래스가 아님), 이것은 (이론적으로) 더 나은 rng보다 랜덤 클래스입니다. rngcryptoserviceprovider가 클래스 수준의 객체 인 경우 이것을 쉽게 무작위의 확장으로 만들거나 자신의 임의 클래스를 만들 수 있습니다.

using System.Security.Cryptography;
public static Int64 NextInt64()
{
   var bytes = new byte[sizeof(Int64)];    
   RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider();
   Gen.GetBytes(bytes);    
   return BitConverter.ToInt64(bytes , 0);        
}

비트 시프트를 사용하여 31 비트 랜덤 숫자에서 64 비트 랜덤 번호를 구성 할 수 있지만 충분한 비트를 얻으려면 3 개의 31 비트 숫자를 사용해야합니다.

long r = rnd.Next();
r <<= 31;
r |= rnd.Next();
r <<= 31;
r |= rnd.Next();

나는 항상 이것을 사용하여 임의의 씨앗을 얻습니다 (간결성을 위해 오류 검사를 제거) :

m_randomURL = "https://www.random.org/cgi-bin/randnum?num=1&min=1&max=1000000000";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(m_randomURL);
StreamReader stIn = new StreamReader(req.GetResponse().GetResponseStream());
Random rand = new Random(Convert.ToInt32(stIn.ReadToEnd()));

Random.org는 대기 노이즈를 사용하여 임의성을 생성하며 복권 등에 분명히 사용됩니다.

이 임의 숫자를 어떻게 사용할 것인지는 말하지 않습니다. 무작위의 "암호화 적으로 안전하다"는 것이 아니며 (큰) 비밀이나 돈이 많은 일에 사용해서는 안됩니다.

당신은 a를 만들 수 있습니다 byte 배열, 임의 데이터로 채우고 다음으로 변환합니다. long (Int64) 그리고 울롱 (UInt64).

byte[] buffer = new byte[sizeof(Int64)];
Random random = new Random();

random.NextBytes(buffer);
long signed = BitConverter.ToInt64(buffer, 0);

random.NextBytes(buffer);
long unsigned = BitConverter.ToUInt64(buffer, 0);

또 다른 대답 RNGCryptoServiceProvider 대신에 Random. 여기서 MSB를 제거하는 방법을 알 수 있으므로 결과는 항상 긍정적입니다.

public static Int64 NextInt64()
{
    var buffer = new byte[8];
    new RNGCryptoServiceProvider().GetBytes(buffer);
    return BitConverter.ToInt64(buffer, 0) & 0x7FFFFFFFFFFFFFFF;
}
Random r=new Random();
int j=r.next(1,23);
Console.WriteLine(j);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top