首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
华为云
V2EX  ›  程序员

如果说 rand()的结果并不是很随机的话,如何在程序中做出更加随机的效果?

  •  
  •   showecho · 43 天前 · 3491 次点击
    这是一个创建于 43 天前的主题,其中的信息可能已经有所发展或是发生改变。
    当然程序上也不能太复杂,也并不是一定要完全随机
    41 回复  |  直到 2018-09-10 11:56:56 +08:00
        1
    cgcs   43 天前
    新的 intel 处理器应该没这个问题了
        2
    zwh2698   43 天前 via Android
    使用 ssl 的随机数会有改善
        3
    thedrwu   43 天前 via Android
    熵池
        4
    hhsuan   43 天前 via Android
    单靠软件是不行的,必须有硬件支持
        5
    carlclone   43 天前
    随机的随机种子
        6
    herozhang   43 天前 via iPhone
    有个随机数的网站,说是从大气白噪声和宇宙微波辐射来产生随机数
        7
    AzadCypress   43 天前 via Android
    真随机拿设备采环境噪声做种子
        9
    shakespaces   43 天前 via Android
    单软件允许联网的话可以用网上的一些 api
    允许硬件的话,linux 有 /dev/random 和 /dev/urandom 可以使用
        10
    wevsty   43 天前   ♥ 1
    Windows:
    C 可以使用 C Run-Time Library 中提供的 rand_s(),或者直接调用 API RtlGenRandom()

    Linux
    可以直接读取 /dev/random 或者 /dev/urandom 生产的数据。

    跨平台
    Cpp 可以使用 std::random_device (需要 C++11 以上)
        11
    402124773   43 天前
    linux 下会用中断增加熵,一些随机中断,是可以用来产生随机数的吧
        12
    zjyl1994   43 天前 via Android
    可以考虑用密码学的随机生成器,那个随机性比较高
        13
    alvin666   43 天前 via Android
    linux 用 ssh 生成密钥据说是用的 cpu 热信息,putty 生成 key 是用鼠标在某区域划动
        14
    silhouette   43 天前 via Android
    硬件随机啊
        15
    newtype0092   43 天前
    rand()不就是“程序上也不能太复杂,也并不是一定要完全随机”吗?
        16
    innoink   43 天前 via Android
    use getrandom()
        17
    winglight2016   43 天前   ♥ 3
    有第三方服务,号称真随机,不过,理论上说,宇宙大爆炸是第一动因,其他都不过是必然的结果,所以真随机的说法也很可疑
        18
    1024MB   43 天前 via Android
    必没有,除非你能证明整个宇宙是随机的
        19
    s609926202   43 天前 via iPhone
    mt_rand ?
        20
    t6attack   43 天前
    如果你的开发中用得上,自然能接触到解决方案。比在这问的专业多了。
        21
    iwtbauh   43 天前 via Android
    cat /dev/random 将返回真随机数

    (至少) Linux 和 FreeBSD 都有这个特性
        22
    Caturra   43 天前
    C++的话 mt19937 应该挺随机的?(道听途说)

    如果只要求看起来勉强随机,但各平台实现简单方便的话可以随机写一个 Rand 如下
    做个模拟扔骰子测试一下感觉还行

    ```C++
    #include<iostream>
    using namespace std;
    unsigned int xjb=233;
    int Rand(){return (xjb=xjb*12345+23333)%6+1;}
    int main(){
    int cnt=1e8, vis[7]={0};
    while(cnt--) vis[Rand()]++;
    cnt=7;
    while(--cnt) cout<<vis[cnt]<<" ";
    return 0;
    }
    ```
        23
    icylogic   43 天前 via iPhone
    这种事情,你要拿需求去评估,才会知道你真正要的是啥。不然等于三千预算进笔记本吧。
        24
    lightening   43 天前 via iPhone
        25
    takato   43 天前
    问题是,你需要多随机呢?至少要有个标准吧。。。

    毕竟,不同的随机程度,成本是截然不同的。。
        26
    qiaobeier   43 天前
    @alvin666 鼠标滑动啊,我今天还这么生成了一个 key,我说这软件怎么怪怪的,原来是这个原理。
        27
    swkl86   43 天前
    只有我好奇楼主要拿那么精确的随机值用来干什么么?
    小白没接触过大世面,求场景,求需求
        28
    longaiwp   43 天前
    @icylogic 加钱加到 2W8 ?
        29
    reus   43 天前
    windows 和 linux 都有可以用于加密的随机发生源,linux 是 /dev/urandom,windows 是 CryptGenRandom
    不是说 rand 就一定不够随机,要看具体的实现。rand 只是一个接口,可以有不同的实现
        30
    Phariel   43 天前 via iPhone
        31
    mingl0280   43 天前
    C#有 RngCryptoServiceProvider 可以生成密码学安全的随机数。
        32
    liuyanjun0826   43 天前 via Android
    时钟随机就足够了,你不可能保证大家都同时起床吧
        33
    dangyuluo   43 天前
    好羡慕能遇到这种问题的人,我目前只要用一个 random_device + mt19973 就满足了。
        34
    imdong   42 天前
    获取用户键鼠操作
        35
    ipwx   42 天前
    脱离需求讲随机不太有意义。

    譬如求积分,随机性只要保证统计随机性即可。
        36
    dychenyi   42 天前
    貌似处理器厂商有专门的的库来做这件事。

    https://developer.amd.com/amd-cpu-libraries_random_number_generator_library_eula/
        37
    ifishman   42 天前 via Android
    随机真的比顺序好用么?
        38
    mandy0119   42 天前
    为什么我觉得用毫秒就可以了(滑稽脸),毕竟就算被伪造请求,每次网络延迟都不同,再不行固定加点 hashcode 后 3 位之类的
        40
    wenzhoou   42 天前 via Android
    就连气候都是一定程度可以预测的。原理可以看看蝴蝶效应。也许整个宇宙都是可以预测的呢。推荐大家看看刘慈欣的“ 镜子”。
        41
    pythonee   42 天前
    23 楼说得对,需要从数学角度上定义需求
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2798 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 27ms · UTC 01:05 · PVG 09:05 · LAX 18:05 · JFK 21:05
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1