V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
showecho
V2EX  ›  程序员

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

  •  
  •   showecho · 2018-09-09 15:19:48 +08:00 · 5302 次点击
    这是一个创建于 2301 天前的主题,其中的信息可能已经有所发展或是发生改变。
    当然程序上也不能太复杂,也并不是一定要完全随机
    41 条回复    2018-09-10 11:56:56 +08:00
    cgcs
        1
    cgcs  
       2018-09-09 15:23:36 +08:00
    新的 intel 处理器应该没这个问题了
    zwh2698
        2
    zwh2698  
       2018-09-09 15:26:40 +08:00 via Android
    使用 ssl 的随机数会有改善
    thedrwu
        3
    thedrwu  
       2018-09-09 15:28:26 +08:00 via Android
    熵池
    hhsuan
        4
    hhsuan  
       2018-09-09 15:31:43 +08:00 via Android
    单靠软件是不行的,必须有硬件支持
    carlclone
        5
    carlclone  
       2018-09-09 15:32:17 +08:00
    随机的随机种子
    herozhang
        6
    herozhang  
       2018-09-09 15:35:15 +08:00 via iPhone
    有个随机数的网站,说是从大气白噪声和宇宙微波辐射来产生随机数
    AzadCypress
        7
    AzadCypress  
       2018-09-09 15:36:27 +08:00 via Android
    真随机拿设备采环境噪声做种子
    shakespaces
        9
    shakespaces  
       2018-09-09 15:49:14 +08:00 via Android
    单软件允许联网的话可以用网上的一些 api
    允许硬件的话,linux 有 /dev/random 和 /dev/urandom 可以使用
    wevsty
        10
    wevsty  
       2018-09-09 15:51:09 +08:00   ❤️ 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  
       2018-09-09 15:57:18 +08:00
    linux 下会用中断增加熵,一些随机中断,是可以用来产生随机数的吧
    zjyl1994
        12
    zjyl1994  
       2018-09-09 16:51:11 +08:00 via Android
    可以考虑用密码学的随机生成器,那个随机性比较高
    alvin666
        13
    alvin666  
       2018-09-09 17:20:14 +08:00 via Android
    linux 用 ssh 生成密钥据说是用的 cpu 热信息,putty 生成 key 是用鼠标在某区域划动
    silhouette
        14
    silhouette  
       2018-09-09 17:21:24 +08:00 via Android
    硬件随机啊
    newtype0092
        15
    newtype0092  
       2018-09-09 17:21:55 +08:00
    rand()不就是“程序上也不能太复杂,也并不是一定要完全随机”吗?
    innoink
        16
    innoink  
       2018-09-09 18:04:26 +08:00 via Android
    use getrandom()
    winglight2016
        17
    winglight2016  
       2018-09-09 18:08:03 +08:00   ❤️ 3
    有第三方服务,号称真随机,不过,理论上说,宇宙大爆炸是第一动因,其他都不过是必然的结果,所以真随机的说法也很可疑
    1024MB
        18
    1024MB  
       2018-09-09 18:12:09 +08:00 via Android
    必没有,除非你能证明整个宇宙是随机的
    s609926202
        19
    s609926202  
       2018-09-09 18:42:29 +08:00 via iPhone
    mt_rand ?
    t6attack
        20
    t6attack  
       2018-09-09 18:51:24 +08:00
    如果你的开发中用得上,自然能接触到解决方案。比在这问的专业多了。
    iwtbauh
        21
    iwtbauh  
       2018-09-09 18:58:04 +08:00 via Android
    cat /dev/random 将返回真随机数

    (至少) Linux 和 FreeBSD 都有这个特性
    Caturra
        22
    Caturra  
       2018-09-09 19:16:39 +08:00
    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  
       2018-09-09 19:40:48 +08:00 via iPhone
    这种事情,你要拿需求去评估,才会知道你真正要的是啥。不然等于三千预算进笔记本吧。
    lightening
        24
    lightening  
       2018-09-09 19:49:58 +08:00 via iPhone
    takato
        25
    takato  
       2018-09-09 20:15:27 +08:00
    问题是,你需要多随机呢?至少要有个标准吧。。。

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

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

    https://developer.amd.com/amd-cpu-libraries_random_number_generator_library_eula/
    ifishman
        37
    ifishman  
       2018-09-10 10:13:19 +08:00 via Android
    随机真的比顺序好用么?
    mandy0119
        38
    mandy0119  
       2018-09-10 10:14:10 +08:00
    为什么我觉得用毫秒就可以了(滑稽脸),毕竟就算被伪造请求,每次网络延迟都不同,再不行固定加点 hashcode 后 3 位之类的
    dychenyi
        39
    dychenyi  
       2018-09-10 10:24:12 +08:00
    wenzhoou
        40
    wenzhoou  
       2018-09-10 11:56:08 +08:00 via Android
    就连气候都是一定程度可以预测的。原理可以看看蝴蝶效应。也许整个宇宙都是可以预测的呢。推荐大家看看刘慈欣的“ 镜子”。
    pythonee
        41
    pythonee  
       2018-09-10 11:56:56 +08:00
    23 楼说得对,需要从数学角度上定义需求
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2739 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:06 · PVG 10:06 · LAX 18:06 · JFK 21:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.