如何生成随机的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位数将生成什么。寻求指导,我应该做些什么来实现我的目标。谢谢。
基于您自己的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);
}