2013-04-08 3 views
0

5 초까지 일정한 6 자리 숫자를 생성하는 논리가 있습니다. 여기에 코드가 있습니다. 문제는 아래의 루틴이 번호를 순차적으로 생성한다는 것입니다. 나는 오히려 어떤 사용자가 다음 번호가 될지 짐작할 수없는 동적 인 것을 원합니다.5 초 후에 만료되는 임의의 6 자리를 생성하는 방법은 무엇입니까?

public static int GetTimestamp() 
{ 
    // 10m ticks in a second, so 50m in 5 seconds 
    const int ticksIn5Seconds = 50000000; 
    return (int)((DateTime.Now.Ticks/ticksIn5Seconds) % 1000000); 
} 

여기에 C#에서 고유 한 8 자리 숫자를 생성하는 또 다른 코드가 있습니다.

public string Get8Digits() 
{ 
    var bytes = new byte[4]; 
    var rng = RandomNumberGenerator.Create(); 
    rng.GetBytes(bytes); 
    uint random = BitConverter.ToUInt32(bytes, 0) % 100000000; 
    return String.Format("{0:D8}", random); 
} 

두 논리를 모두 결합하여 임의의 6 자리 숫자를 생성하려고합니다. 다음 6 자리 숫자가 생성 될 것으로 추측되지 않을 수 있습니다. 지침을 찾고 내 목표를 달성하기 위해 무엇을해야합니다. 감사.

+2

이 문제는 나에게 아무 의미가 없습니다. 임의의 번호를 원하십니까? Random의 Next 메서드를 호출하십시오. 5 초마다 임의의 번호를 원하십니까? 5 초마다 Next (다음)로 전화하십시오. – Dialecticus

답변

4

한 가지 가능한 솔루션 ...

private static DateTime _expiry = DateTime.MinValue; 
    private static string _current = "0"; 

    public string CurrentNumber() 
    { 
     if (_expiry < DateTime.Now) 
     { 
      _expiry = DateTime.Now.AddSeconds(5); 
      _current = Get8Digits(); 
     } 

     return _current; 
    } 
+0

하나의 요청은 같은 프로그램이 다중 PC에서 실행될 때 두 PC에 동일한 번호를 생성하는 변경이있는 경우에 한 요청이다. 그래서 나는 그것을 현명하게 만들 수있다. 사용자 ID는 숫자 또는 알파 num 컬렉션 일 수 있습니다. 그러니 다음 5 초 동안 살아남을 수있는 사용자 ID를 기반으로 난수를 생성 할 수있는 방법을 알려주십시오. – Thomas

+1

@ 토마스 : 두 명의 기계가 주어진 사용자 ID 값이 같으면 동일한 시간 간격으로 동일한 난수를 생성해야합니까? 이것은 상당히 문제를 변화시킵니다. RB의 솔루션은 두 머신에서 시간이 동기화되는 한이를 처리하기 위해 업데이트 될 수 있지만 이제는 더 중요한 질문이 있습니다. 당신은 실제로 무엇을 성취하고 싶습니까? – Dialecticus

0

모듈러 5 초 (실제로 시간 - 시간 % 5s)로 의사 임의 생성기를 시드 할 수 있습니다. 그것은 효과가 있지만 예측할 수없는 숫자를 얻는 최선의 방법은 아닙니다. 코드

편집 : 더 코드

Random random = new Random(DateTime.Now.Ticks - (DateTime.Now.Ticks % 50000000)); 

Edit2가 :

int random5 = random.Next(100000, 999999) 
+0

"매번 무작위로"란 무엇을 의미합니까? 5 초 시간 프레임에서 시드는 동일하므로 난수도 동일합니다. 그러나 나는 PRNG의 최초 생성 번호 만 사용하는 것이 효율적이지 않다는 것에 동의합니다. – zakinster

+0

이것은 datetime 틱을 반환하는 것으로 추측하기가 더 어려울 것 같지 않습니다 - 랜덤은 예측 가능하며 모든 사람들이 주어진 시간 동안 그것을 계산할 수 있으며 "누구나 추측 할 수있는"부분을 채우지 못합니다 –

+0

datetime을 반환하지 않습니다 틱, 당신은 임의의 객체를 사용하여 RB가 자신의 대답으로 보여주는 것처럼 하나의 난수를 생성해야합니다. – zakinster

-1

내가 당신의 질문을 이해하면 다른 난수 모든를 생성하는 난수 생성기를 생성하도록 할 수 5 초. 자신의 Get8Digits 방법에 따라

public int GetRandomValue() 
{ 
    // Seed the RNG with an integer that changes every 5 seconds. 
    Random rnd = new Random((int)(DateTime.Now.Ticks/ticksIn5Seconds)); 
    // Generate a 6 digit random number. 
    return rnd.Next(100000, 999999); 
} 
+0

이것은 매번 무작위로 5 초 동안 유지하지 않을 것입니다. –

+0

@StenPetrov 아니요. 분명하지 않은 경우에 대비하여 * 무작위로 개체를 재사용하지는 않는다는 것을 분명히하기 위해 답을 편집했습니다. –

+0

5 초마다 6 자리 난수를 생성하고 싶지만 5 초 안에 숫자가 변경되지 않습니다. 내가 알 겠어? – Thomas

0
private static Stopwatch age; // init me 
private static int lastRandom = 0; 
public static int GetTimestamp() 
{ 
    if (age.Elapsed.TotalSeconds>5 ||lastRandom==0){ 
    lastRandom = Guid.NewGuid().GetHash(); // stronger random than Random 
    age.Reset(); 
    } 
    return lastRandom % 100000; // limit the digits to 6, assuming leading 0s 
} 
+0

'.GetHash()'는 음수를 반환 할 수 있습니다 ... –

+1

'Guid(). GetHash()'를 무작위 생성기로 사용하지 말 것을 권장합니다. 강력한 임의성을 위해'Random' 또는'System.Security.Cryptography.RandomNumberGenerator'를 사용하십시오. – Rik

+0

'랜덤 (Random) '은 당신이 * for *에 대해 조언하고 있다면 알맞은 난수 생성기가 될 수 없습니다. Cryto는 GUID –

관련 문제