如何生成随机的6位,5秒后过期

本文关键字:5秒 过期 6位 何生成 随机 | 更新日期: 2023-09-27 18:07:58

我得到了一个逻辑,生成一个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位数将生成什么。寻求指导,我应该做些什么来实现我的目标。谢谢。

如何生成随机的6位,5秒后过期

基于您自己的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;
    }
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
}

你可以用时间模为5秒的伪随机生成器作为种子(实际上是time - time % 5s)。这是可行的,但这不是获得良好的非预测性数字的最佳方法。

编辑代码:

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

Edit2 with more code:

int random5 = random.Next(100000, 999999)

我理解你的问题是你想要生成一个随机数生成器,每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); 
}