2013-04-08 141 views
0

我得到了一個邏輯,它產生一個6位數的數字,保持5秒不變。這是代碼。問題是下面的例程生成數字順序,我不想要,而是我想動態,任何用戶不能猜測什麼是下一個數字。如何生成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秒呼叫一次。 – Dialecticus 2013-04-08 14:38:25

回答

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

一個請求,如果同一個程序運行在multile pc上,則會有兩個pc產生相同數字的改變。所以我可以讓它明智地使用它。用戶ID可以是數字或字母數字的集合。那麼告訴我如何根據用戶ID生成隨機數字,以保證在接下來的5秒內保持活躍狀態​​? – Thomas 2013-04-08 18:40:53

+1

@Thomas:如果給定的某個用戶ID值相同,兩臺機器必須在相同的時間間隔內生成相同的隨機數?這大大改變了這個問題。只要時間在兩臺機器上同步,RB的解決方案就可以進行更新,以解決這個問題,但現在對您來說存在更重要的問題。你究竟想實現什麼? – Dialecticus 2013-04-08 21:43:09

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 2013-04-08 14:34:47

+0

這不會是更難猜測只是返回日期時間滴答 - 隨機將是可預測的,每個人都可以計算它給定的時間,不符合「任何人都可以猜到」部分 – 2013-04-08 14:39:39

+0

我沒有返回日期時間蜱,你應該使用隨機對象來產生一個隨機數作爲RB顯示在他自己的答案。 – zakinster 2013-04-08 14:41:01

-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秒 – 2013-04-08 14:31:04

+0

@StenPetrov不,它不是。我已經編輯了答案,以清楚說明我們不重複使用Random對象,以防不明顯。 – 2013-04-08 14:35:59

+0

我想每5秒後生成一個6位數的隨機數,但在5秒內這個數字不會改變。我清楚了嗎? – Thomas 2013-04-08 14:36:57

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()'可以返回負數... – 2013-04-08 14:37:48

+1

我建議不要使用'Guid()。GetHash()'作爲隨機生成器,因爲這不是它的意思。要麼使用Random,要麼使用System.Security.Cryptography.RandomNumberGenerator來獲得更強的隨機性。 – Rik 2013-04-08 14:37:56

+0

「隨機」甚至不是一個體面的隨機數發生器,如果你建議*爲*它。 Cryto被GUID – 2013-04-08 14:41:03