V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
showecho
V2EX  ›  程序员

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

  •  
  •   showecho · Sep 9, 2018 · 5941 views
    This topic created in 2795 days ago, the information mentioned may be changed or developed.
    当然程序上也不能太复杂,也并不是一定要完全随机
    41 replies    2018-09-10 11:56:56 +08:00
    cgcs
        1
    cgcs  
       Sep 9, 2018
    新的 intel 处理器应该没这个问题了
    zwh2698
        2
    zwh2698  
       Sep 9, 2018 via Android
    使用 ssl 的随机数会有改善
    thedrwu
        3
    thedrwu  
       Sep 9, 2018 via Android
    熵池
    hhsuan
        4
    hhsuan  
       Sep 9, 2018 via Android
    单靠软件是不行的,必须有硬件支持
    carlclone
        5
    carlclone  
       Sep 9, 2018
    随机的随机种子
    herozhang
        6
    herozhang  
       Sep 9, 2018 via iPhone
    有个随机数的网站,说是从大气白噪声和宇宙微波辐射来产生随机数
    AzadCypress
        7
    AzadCypress  
       Sep 9, 2018 via Android
    真随机拿设备采环境噪声做种子
    shakespaces
        9
    shakespaces  
       Sep 9, 2018 via Android
    单软件允许联网的话可以用网上的一些 api
    允许硬件的话,linux 有 /dev/random 和 /dev/urandom 可以使用
    wevsty
        10
    wevsty  
       Sep 9, 2018   ❤️ 1
    Windows:
    C 可以使用 C Run-Time Library 中提供的 rand_s(),或者直接调用 API RtlGenRandom()

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

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

    (至少) Linux 和 FreeBSD 都有这个特性
    Caturra
        22
    Caturra  
       Sep 9, 2018
    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;
    }
    ```
    icylogic
        23
    icylogic  
       Sep 9, 2018 via iPhone
    这种事情,你要拿需求去评估,才会知道你真正要的是啥。不然等于三千预算进笔记本吧。
    lightening
        24
    lightening  
       Sep 9, 2018 via iPhone
    takato
        25
    takato  
       Sep 9, 2018
    问题是,你需要多随机呢?至少要有个标准吧。。。

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

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

    https://developer.amd.com/amd-cpu-libraries_random_number_generator_library_eula/
    ifishman
        37
    ifishman  
       Sep 10, 2018 via Android
    随机真的比顺序好用么?
    mandy0119
        38
    mandy0119  
       Sep 10, 2018
    为什么我觉得用毫秒就可以了(滑稽脸),毕竟就算被伪造请求,每次网络延迟都不同,再不行固定加点 hashcode 后 3 位之类的
    wenzhoou
        40
    wenzhoou  
       Sep 10, 2018 via Android
    就连气候都是一定程度可以预测的。原理可以看看蝴蝶效应。也许整个宇宙都是可以预测的呢。推荐大家看看刘慈欣的“ 镜子”。
    pythonee
        41
    pythonee  
       Sep 10, 2018
    23 楼说得对,需要从数学角度上定义需求
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1030 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 143ms · UTC 23:33 · PVG 07:33 · LAX 16:33 · JFK 19:33
    ♥ Do have faith in what you're doing.