如何在csh中随机生成0或1?参考bash实现示例
在csh中生成0/1随机数的几种实用方案
我来帮你搞定csh里生成0和1随机数的需求,结合你之前用awk的使用习惯,给你几个靠谱的解决办法:
1. 直接修改现有awk命令(最适配你的原有操作)
你之前用awk生成1000-10000的随机数,只要调整计算逻辑就能快速生成0或1。awk的rand()函数会返回0到1之间的浮点数(不包含1),乘以2后取整刚好能得到0或1。在csh里的命令写法如下:
set randm = `awk 'BEGIN{srand(); print int(rand()*2)}'`
srand()用来初始化随机种子,保证每次运行能得到不同的随机序列int(rand()*2)把0-1的浮点数映射为0或1两个整数
2. 更高效的方案:利用系统随机设备/dev/urandom
如果需要频繁生成随机数,反复调用awk这类外部工具会有性能开销。直接读取系统的/dev/urandom随机设备是更高效的选择,还能得到高质量的随机数:
# 方法1:用csh内置算术处理,减少外部工具调用 @ randm = (`head -c 1 /dev/urandom | od -An -tu1`) % 2 # 方法2:用awk辅助取模,写法更简洁 set randm = `head -c 1 /dev/urandom | od -An -tu1 | awk '{print $1%2}'`
/dev/urandom提供系统级的随机字节,比awk的伪随机更可靠head -c1读取1个随机字节,od -An -tu1将字节转换为无符号十进制整数,最后取模2得到0或1
3. 批量生成(对应你bash脚本的10万次需求)
如果要像bash脚本那样生成10万条带序号的0/1数据,绝对不要在csh里循环调用外部命令(会非常慢),直接让awk完成整个循环是最优解:
awk 'BEGIN{srand(); for(i=1;i<=100000;i++) print i, int(rand()*2)}' > r-test.dat
这个命令只启动一次awk进程,内部完成10万次循环,速度比csh循环快几个数量级。
小总结
- 单条随机数生成:第一种awk方法简单直观,足够用
- 批量生成或对性能有要求:优先用第三种awk批量写法,或者/dev/urandom的方案
内容的提问来源于stack exchange,提问作者Sadra Avestan
相关产品推荐
相关产品推荐

