线程安全的随机数

Microsoft .NET Framework 内部实现的随机数算法重复率很低,但也意味着需要消耗更多的CPU,并且如果一个线程上面持续使用相同随机数对象实例,会导致陷入随机数获取的死循环,C/C++ 自己从.NET框架摘要的C#翻译为C++的实现还能自己去控制一下防止死循环,但用C#直接用这个对象就有危险了,当然单个随机实例重复用不多,不会掉死循环里面去。

int server_random_r(volatile unsigned int* seed) {
    unsigned int next = *seed;
    int result;

    next *= 1103515245;
    next += 12345;
    result = (unsigned int)(next / 65536) % 2048;

    next *= 1103515245;
    next += 12345;
    result <<= 10;
    result ^= (unsigned int)(next / 65536) % 1024;

    next *= 1103515245;
    next += 12345;
    result <<= 10;
    result ^= (unsigned int)(next / 65536) % 1024;

    *seed = next;
    return result;
}

int server_random(int min, int max) {
    static volatile unsigned int seed = time(NULL);

    int v = server_random_r(&seed);
    return v % (max - min + 1) + min;
}

int server_random_ascii() {
    static Byte x_[] = { 'a', 'A', '0' };
    static Byte y_[] = { 'z', 'Z', '9' };

    int i_ = server_random() % 3;
    return server_random(x_[i_], y_[i_]);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值