如果RANDOM最多只能到32767,如何生成9位随机数?

问题描述 投票:0回答:6

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

我正在尝试类似的方法,但它只给出了低于 32768 的数字。

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

请帮忙

输出应该是

********Random453351111

bash shell unix sh
6个回答
3
投票

在 Linux 中使用

/dev/urandom
:

$ rnd=$(tr -cd "[:digit:]" < /dev/urandom | head -c 9) && echo $rnd
463559879

2
投票

我想这应该可以

shuf -i 99999999-999999999 -n 1


1
投票

作为解决方法,我们可以简单地请求 1 个随机整数,持续

n
次:

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

echo $rand

在线尝试!


注意 [1]:由于

RANDOM
的上限的最后一位数字为
7
,因此“生成”的数字包含
8
9
'的变化稍小一些s.


1
投票

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

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

#!/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"

0
投票

使用perl,如下:

perl -e print\ rand | cut -c 3-11 

或者

perl -MPOSIX -e 'print floor rand 10**9'

0
投票

如果存在(bash >= 5.1 或 khs93),则使用变量 SRANDOM,如果不存在,则使用 RANDOM 生成 10 个数字长度的数字。完全内置。

rand10()
{
   xrand=""
   for xc in {1..4}
   do
         x=$(printf '%04d' $(( RANDOM % 10000 )) )
         xrand=$xrand${x:0:3}
   done
   echo "${xrand:0:10}"
}

[ "$SRANDOM" = "" ] && SRANDOM=$(rand10)
printf '%09d\n' $(( SRANDOM % 1000000000 ))
© www.soinside.com 2019 - 2024. All rights reserved.