Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如果RANDOM仅上升到32767,如何生成9位随机数?_Bash_Shell_Unix_Sh - Fatal编程技术网

Bash 如果RANDOM仅上升到32767,如何生成9位随机数?

Bash 如果RANDOM仅上升到32767,如何生成9位随机数?,bash,shell,unix,sh,Bash,Shell,Unix,Sh,如何在shell中生成9位随机数 我正在尝试类似的东西,但它只给出了32768以下的数字 #!/bin/bash mo=$((RANDOM%999999999)) echo "********Random"$mo 请帮忙 输出应为******RANDOM 453351111,因为RANDOM的范围有限,它一次只能用于检索四个以10为基数的数字。因此,要检索9位数字,您需要调用它三次 如果我们不太关心性能(愿意支付流程替代成本),这可能看起来像: #!/usr/bin/env

如何在shell中生成9位随机数

我正在尝试类似的东西,但它只给出了32768以下的数字

#!/bin/bash
mo=$((RANDOM%999999999))
echo "********Random"$mo
请帮忙


输出应为
******RANDOM 453351111

,因为RANDOM的范围有限,它一次只能用于检索四个以10为基数的数字。因此,要检索9位数字,您需要调用它三次

如果我们不太关心性能(愿意支付流程替代成本),这可能看起来像:

#!/usr/bin/env bash
get4() {
  local newVal=32768
  while (( newVal > 29999 )); do # avoid bias because of remainder
    newVal=$RANDOM
  done
  printf '%04d' "$((newVal % 10000))"
}

result="$(get4)$(get4)$(get4)"
result=$(( result % 1000000000 ))
printf '%09d\n' "$result"
#!/usr/bin/env bash
get4() {
  local newVal=32768 outVar=$1
  while (( newVal > 29999 )); do # avoid bias because of remainder
    newVal=$RANDOM
  done
  printf -v "$outVar" '%04d' "$((newVal % 10000))"
}

get4 out1; get4 out2; get4 out3
result="${out1}${out2}${out3}"
result=$(( result % 1000000000 ))
printf '%09d\n' "$result"
如果我们真的关心性能,它可能会变成:

#!/usr/bin/env bash
get4() {
  local newVal=32768
  while (( newVal > 29999 )); do # avoid bias because of remainder
    newVal=$RANDOM
  done
  printf '%04d' "$((newVal % 10000))"
}

result="$(get4)$(get4)$(get4)"
result=$(( result % 1000000000 ))
printf '%09d\n' "$result"
#!/usr/bin/env bash
get4() {
  local newVal=32768 outVar=$1
  while (( newVal > 29999 )); do # avoid bias because of remainder
    newVal=$RANDOM
  done
  printf -v "$outVar" '%04d' "$((newVal % 10000))"
}

get4 out1; get4 out2; get4 out3
result="${out1}${out2}${out3}"
result=$(( result % 1000000000 ))
printf '%09d\n' "$result"

由于RANDOM的范围有限,它一次只能检索四个10进制数字。因此,要检索9位数字,您需要调用它三次

如果我们不太关心性能(愿意支付流程替代成本),这可能看起来像:

#!/usr/bin/env bash
get4() {
  local newVal=32768
  while (( newVal > 29999 )); do # avoid bias because of remainder
    newVal=$RANDOM
  done
  printf '%04d' "$((newVal % 10000))"
}

result="$(get4)$(get4)$(get4)"
result=$(( result % 1000000000 ))
printf '%09d\n' "$result"
#!/usr/bin/env bash
get4() {
  local newVal=32768 outVar=$1
  while (( newVal > 29999 )); do # avoid bias because of remainder
    newVal=$RANDOM
  done
  printf -v "$outVar" '%04d' "$((newVal % 10000))"
}

get4 out1; get4 out2; get4 out3
result="${out1}${out2}${out3}"
result=$(( result % 1000000000 ))
printf '%09d\n' "$result"
如果我们真的关心性能,它可能会变成:

#!/usr/bin/env bash
get4() {
  local newVal=32768
  while (( newVal > 29999 )); do # avoid bias because of remainder
    newVal=$RANDOM
  done
  printf '%04d' "$((newVal % 10000))"
}

result="$(get4)$(get4)$(get4)"
result=$(( result % 1000000000 ))
printf '%09d\n' "$result"
#!/usr/bin/env bash
get4() {
  local newVal=32768 outVar=$1
  while (( newVal > 29999 )); do # avoid bias because of remainder
    newVal=$RANDOM
  done
  printf -v "$outVar" '%04d' "$((newVal % 10000))"
}

get4 out1; get4 out2; get4 out3
result="${out1}${out2}${out3}"
result=$(( result % 1000000000 ))
printf '%09d\n' "$result"

我想这应该可以

shuf -i 99999999-999999999 -n 1


我想这应该可以

shuf -i 99999999-999999999 -n 1


作为一种解决方法,我们可以简单地要求1个随机整数,对于
n
次:

rand=''
for i in {1..9}; do
    rand="${rand}$(( $RANDOM % 10 ))"
done

echo $rand



注意:由于
RANDOM
的上限最后一位是
7
,因此“生成的”数字包含
8
9
的变化较小。

作为一种解决方法,我们可以简单地要求1个随机整数,用于
n
次:

rand=''
for i in {1..9}; do
    rand="${rand}$(( $RANDOM % 10 ))"
done

echo $rand



注意:由于
RANDOM
的上限最后一位是
7
,“生成的”数字包含
8
9

在使用
/dev/uradom
的Linux中:

$ rnd=$(tr -cd "[:digit:]" < /dev/urandom | head -c 9) && echo $rnd
463559879
$rnd=$(tr-cd“[:digit:”
在Linux中使用
/dev/uradom

$ rnd=$(tr -cd "[:digit:]" < /dev/urandom | head -c 9) && echo $rnd
463559879
$rnd=$(tr-cd“[:digit:”
您需要生成多个较小的数字,并将它们相互追加
RANDOM
最多只能达到32767。这能回答你的问题吗?@Ivan,因为它没有描述如何生成比RANDOM本身更宽范围的数字,我怀疑它能回答。这能回答你的问题吗?不,这不是@phuclv的情况。您需要生成多个较小的数字,并将它们相互追加
RANDOM
最多只能达到32767。这能回答你的问题吗?@Ivan,因为它没有描述如何生成比RANDOM本身更宽范围的数字,我怀疑它能回答。这能回答你的问题吗?不,不是这样的@phuclvThis对我有效。顺便说一句,这有点偏颇。因为
RANDOM
上升到最后一位为7的数字,这意味着8和9的可能性比下面的数字小一些。这对我来说很有效。顺便说一句,这有点偏颇。因为
RANDOM
上升到最后一位是7的数字,这意味着8和9的可能性比下面的数字要小一些。让我也试试这个。nod——一次1位数的方法有效,但它消耗的熵比它需要的要多;一次4个更快(当您使用的版本不会因使用
$(…)
而减慢速度时);这也提供了一个更随机的数字,因为重新滚动的东西不能平均地划分为10000。让我也试试这个。nod——一次1位数的方式工作,但它消耗的熵比它需要的要多;一次4个更快(当您使用的版本不会因使用
$(…)
而减慢速度时);此外,这还提供了一个更随机的数字,因为重新滚动的数据不能平均划分为10000。这是可行的,但不幸的是,从
/dev/uradom
中获取的数据比您实际需要的要多得多(因为任何不是数字的数据都会被丢弃)。使用
/dev/uradom
的更好方法是只读取单个64位整数作为64位数据,因此消耗的熵总量被限制为8个字节——尽管用Python或C编写比用bash更容易,但是从
/dev/uradom
中获取的数据比您真正需要的要多得多,这真的很不幸(因为任何不是数字的东西都会被扔掉)。使用
/dev/uradom
的一个更好的方法是只读取一个64位整数作为64位数据,因此消耗的熵总量被限制为8字节——尽管用Python或C编写比用bash更容易。允许前导零更好:
printf'%010d\n'$(shuf-i 0-999999999-n 1)
printf'%09d\n'$(shuf-i0-99999999-n1)
对于这种特殊情况,允许前导零更好:
printf'%010d\n'$(shuf-i0-99999999999-n1)
printf'%09d\n'$(shuf-i0-999999-n1)
对于这种特殊情况:)