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

2018-09-09 15:19:48 +08:00
 showecho
当然程序上也不能太复杂,也并不是一定要完全随机
5328 次点击
所在节点    程序员
41 条回复
iwtbauh
2018-09-09 18:58:04 +08:00
cat /dev/random 将返回真随机数

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

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

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

https://developer.amd.com/amd-cpu-libraries_random_number_generator_library_eula/
ifishman
2018-09-10 10:13:19 +08:00
随机真的比顺序好用么?
mandy0119
2018-09-10 10:14:10 +08:00
为什么我觉得用毫秒就可以了(滑稽脸),毕竟就算被伪造请求,每次网络延迟都不同,再不行固定加点 hashcode 后 3 位之类的
dychenyi
2018-09-10 10:24:12 +08:00
wenzhoou
2018-09-10 11:56:08 +08:00
就连气候都是一定程度可以预测的。原理可以看看蝴蝶效应。也许整个宇宙都是可以预测的呢。推荐大家看看刘慈欣的“ 镜子”。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/487636

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX