C#에서 임의 값을 생성합니다.
-
21-08-2019 - |
문제
어떻게 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는 대기 노이즈를 사용하여 임의성을 생성하며 복권 등에 분명히 사용됩니다.
이 임의 숫자를 어떻게 사용할 것인지는 말하지 않습니다. 무작위의 "암호화 적으로 안전하다"는 것이 아니며 (큰) 비밀이나 돈이 많은 일에 사용해서는 안됩니다.
또 다른 대답 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);