0

我得到了一个逻辑,它生成一个 6 位数字,该数字在 5 秒内保持不变。这是代码。问题是下面的例程按顺序生成数字,我不想要我想要动态的,任何用户都无法猜测下一个数字是什么。

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 位数字会生成什么。寻求指导我应该怎么做才能实现我的目标。谢谢。

4

4 回答 4

4

基于您自己的Get8Digits方法的一种可能的解决方案...

    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;
    }
于 2013-04-08T14:35:56.937 回答
0

您可以使用时间模 5 秒(实际上是时间 - 时间 % 5s)为伪随机生成器播种。它会起作用,但它不是获得好的不可预测数字的最佳方法。

用代码编辑:

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

Edit2 有更多代码:

int random5 = random.Next(100000, 999999)
于 2013-04-08T14:26:36.043 回答
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
}
于 2013-04-08T14:30:27.553 回答
-1

我理解你的问题是你想生成一个随机数生成器,它将每 5 秒生成一个不同的随机数。

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); 
}
于 2013-04-08T14:28:15.020 回答