中奖同学
- 5元: 丁元霞
- 10元:Joker 沫沫老师 谭家华
第一个实现:有空白
#!/bin/bash
rand() {
# 从文件中读取所有人的信息,用..代替空格
local seeds=`while read line;do echo ${line// /..} ;done < tmp.txt`
local count=0
# 不停的进行筛选,直到只剩一个同学为止
while [[ $count != 1 ]];do
#从seeds中筛选出一部分人:进行猜拳操作,如果是1,进行下一轮,如果是0,则淘汰
seeds=`for seed in $seeds;do (($RANDOM%2)) && echo $seed;done`
#计算当前幸运人数
count=`echo "$seeds" | wc -l`
done
echo $seeds
}
rand
第二个实现:无空白
#!/bin/bash
rand() {
# 从文件中读取所有人的信息,用..代替空格
local seeds=`while read line;do echo ${line// /..} ;done < tmp.txt`
local count=0
# 不停的进行筛选,直到只剩一个同学为止
while [[ $count != 1 ]];do
#从seeds中筛选出一部分人:进行猜拳操作,如果是1,进行下一轮,如果是0,则淘汰
seeds=`for seed in $seeds;do (($RANDOM%2)) && echo $seed;done`
#计算当前幸运人数
count=`echo "$seeds" | wc -l`
done
# 如果发现是空,就再进行筛选
if [[ $seeds == "" ]];then
# 递归调用,本函数
rand
else
# 如果不是空,则输出
echo $seeds
fi
}
rand
实现3:去重
#!/bin/bash
#筛选出一个人
rand() {
# 从文件中读取所有人的信息,用..代替空格
local seeds=`while read line;do echo ${line// /..} ;done < tmp.txt`
local count=0
# 不停的进行筛选,直到只剩一个同学为止
while [[ $count != 1 ]];do
#从seeds中筛选出一部分人:进行猜拳操作,如果是1,进行下一轮,如果是0,则淘汰
seeds=`for seed in $seeds;do (($RANDOM%2)) && echo $seed;done`
#计算当前幸运人数
count=`echo "$seeds" | wc -l`
done
if [[ $seeds == "" ]];then
rand
else
echo $seeds
fi
}
#筛选出多个人
res() {
# 可以用for实现从1到10的遍历
for i in {1..10};do
tmp=`rand`
# 去重
while [[ `is_repeat $tmp` == 0 ]];do
tmp=`rand`
done
arrs[$i]=$tmp
done
echo ${arrs[@]}
}
#把输进来的数据与数组内的值进行比较
#如果有相同的值,则echo 0
#如果没有相同的值 ,则echo 1
is_repeat() {
#遍历数组
for arr in ${arrs[@]};do
# 把输进来的值与数组中的每一个值进行比较
if [[ $arr == $1 ]];then
# 如果相同,输出0
echo 0;
# 结束函数
return 0;
fi
done
# 如果没有相同的值 ,则输出1
echo 1
}
res
实现4: 外部数据参数化
#筛选出多个人
res() {
# 此处$1是别人传给res的值
for((i=0;i<$1;i++));do
tmp=`rand`
# 去重
while [[ `is_repeat $tmp` == 0 ]];do
tmp=`rand`
done
arrs[$i]=$tmp
done
echo ${arrs[@]}
}
# 把脚本外的值转递给res函数
res $1