Linux下的伪随机数生成函数

合集下载

LinuxBash编程:随机数生成、对浮点数进行四舍五入运算

LinuxBash编程:随机数生成、对浮点数进行四舍五入运算

LinuxBash编程:随机数⽣成、对浮点数进⾏四舍五⼊运算本⽂介绍使⽤shell实现随机数⽣成以及对浮点数进⾏四舍五⼊运算。

⽬录随机数⽣成⽣成0-1之间的随机数⽣成0-1的随机数:#!/bin/bashrandom_number=`echo "scale=4 ; ${RANDOM}/32767" | bc -l` # ⽣成0-1的随机数# random_number=`bc -l <<< "scale=4 ; ${RANDOM}/32767"`echo $random_numberexit 0执⾏:$ sh random.sh.8696$ sh random.sh.4517$ sh random.sh.5126${RANDOM}函数产⽣0 - 32767之间的伪随机整数。

其中32767(2^15 - 1)是有符号16位整数的上限。

scale=4:保留4位⼩数⽣成0-n之间的随机数⽣成0-10之间的随机数:#!/bin/bashsize=10max=$(( 32767 / size * size ))while (( (rand=$RANDOM) >= max )); do :; donerand=$(( rand % (size+1) ))echo $rand⽣成1-10之间的随机数:#!/bin/bashsize=10max=$(( 32767 / size * size ))while (( (rand=$RANDOM) >= max )); do :; donerand=$(( rand % (size) + 1 ))echo $randmax=$(( 32767 / size * size ))语句⽐较关键,这么处理的原因是${RANDOM}产⽣的最⼤数是32767,如果⽣成1-10之间的随机数,需要去掉32761-32767之间的数,否则会导致出现9和10的概率和其它数不⼀样。

linux用于产生随机数的方法

linux用于产生随机数的方法

在Linux中,你可以使用多种方法来生成随机数。

以下是一些常见的方法:1. 使用`/dev/urandom`:`/dev/urandom`是一个在Unix-like系统上产生随机数的设备文件。

你可以使用`cat`、`dd`或其他工具从它那里读取数据。

例如,要生成一个10字节的随机数:```bashhead /dev/urandom | tr -dc A-Za-z0-9 | head -c10```2. 使用`openssl`命令:`openssl`是一个强大的工具,可以用来生成随机数。

例如,要生成一个10字节的随机数:```bashopenssl rand -base64 10```3. 使用`shuf`命令:`shuf`命令可以用来随机排序文件中的行或生成随机行。

例如,要生成一个10个随机数:```bashshuf -i 1-100 -n 10```4. 使用`/dev/random`:与`/dev/urandom`相似,但`/dev/random`在系统中的熵池耗尽时可能会阻塞。

除非你需要更高质量的随机数,否则通常建议使用`/dev/urandom`。

5. 使用C语言:如果你想在C程序中生成随机数,可以使用标准库中的函数,如`rand()`。

但请注意,`rand()`通常不是真正的随机数生成器,而是伪随机数生成器。

如果你需要真正的随机数,你可能需要使用更复杂的库或方法。

6. 使用其他命令和工具:还有其他许多命令和工具可以用来生成随机数,具体取决于你的需求和可用的工具。

总之,选择哪种方法取决于你的具体需求。

如果你只是需要快速地生成一个随机数或字符串,那么使用`/dev/urandom`或`openssl`可能是最简单的方法。

如果你需要更复杂的随机数生成或加密操作,那么可能需要使用更专业的工具或库。

rand函数原理

rand函数原理

rand函数原理
rand函数是一种产生伪随机数的函数。

在计算机科学中,伪随机数指的是通过确定性算法产生的看似随机的数列。

rand函数的原理是根据一个种子值生成伪随机数,通过对种子值进行一系列的数学运算和变换,最终得到一个看似随机的数值。

然而,由于种子值是确定的,所以每次运行rand函数时,所得到的
数值序列是可以重现的。

通常情况下,rand函数会使用系统时钟作为种子值,以保证每次运行时得到的伪随机数序列都是不同的。

具体而言,rand函数会将种子值作为输入,然后通过一系列的算法和计算步骤,生成一个伪随机数作为输出。

这个输出的范围通常是0到RAND_MAX之间的一个整数。

而RAND_MAX的值则是由具体的编程语言或系统所定义的最大的随机数。

需要注意的是,rand函数所生成的伪随机数具有一定的重复性和周期性。

这是因为伪随机数的生成是基于种子值的计算,而如果种子值相同,那么所生成的伪随机数序列也会相同。

另外,伪随机数序列还存在一个周期,即在一定的循环次数后,所生成的伪随机数序列会重复。

因此,在使用rand函数时需要对
其生成的伪随机数进行适当的处理,以避免重复和周期性带来的问题。

linux下的rand函数

linux下的rand函数

linux下的rand函数rand函数是Linux下的一个随机数生成函数,它可以生成一个范围内的随机整数。

在Linux系统中,rand函数是一个非常常用的函数,它可以用来生成随机数,以满足各种需求。

要使用rand函数,首先需要包含头文件<cstdlib>,然后调用srand函数来设置种子,最后使用rand函数来生成随机数。

srand 函数用来设置随机数生成器的种子,通常可以使用time函数来获取当前的时间作为种子,以保证每次生成的随机数都是不同的。

下面是一个简单的例子,展示了如何使用rand函数生成一个范围内的随机整数:```cpp#include <iostream>#include <cstdlib>#include <ctime>int main() {// 设置种子srand(time(0));// 生成随机数int randomNumber = rand();// 输出随机数std::cout << "随机数:" << randomNumber << std::endl;return 0;}```在该例子中,我们使用了srand函数将当前时间作为种子,然后使用rand函数生成一个随机整数,并将其输出到屏幕上。

运行该程序,每次都会生成不同的随机数。

除了生成一个范围内的随机整数外,rand函数还可以生成其他类型的随机数,如随机浮点数。

通过一些简单的运算,我们可以将rand 函数生成的随机整数转换成我们想要的类型。

以下是一个例子,展示了如何生成一个范围内的随机浮点数:```cpp#include <iostream>#include <cstdlib>#include <ctime>int main() {// 设置种子srand(time(0));// 生成随机浮点数float randomFloat = rand() / static_cast<float>(RAND_MAX);// 输出随机浮点数std::cout << "随机浮点数:" << randomFloat << std::endl; return 0;}```在该例子中,我们使用了rand函数生成一个随机整数,然后将其除以RAND_MAX,再将结果转换成浮点数,从而得到一个范围在0到1之间的随机浮点数。

Linux密码学随机数

Linux密码学随机数

Linux密码学随机数
在Linux系统中,密码学随机数通常由内核提供,并且可以通过各种方式使用。

这些随机数对于加密、密钥生成和其他安全相关的操作非常重要。

在Linux中,你可以通过以下方式获得密码学随机数:
1. /dev/random 和/dev/urandom:这两个设备文件是Linux系统中最常用的密码学随机数生成器。

它们由内核提供。

`/dev/random` 会产生高质量的随机数,但可能会阻塞等待熵(系统中的随机性源),如果系统熵不足。

而`/dev/urandom` 则不会阻塞,但它会尽量保持生成高质量的随机数,如果熵不足,可能会包含一些伪随机性。

2. OpenSSL:OpenSSL 是一个流行的密码库,它可以用于生成随机数。

你可以使用`openssl rand` 命令来生成密码学安全的随机数。

例如:
```bash
openssl rand -hex 16
```
上述命令会生成一个包含16个十六进制字符的随机数。

3. Cryptographic Libraries:许多编程语言和密码学库都提供了生成密码学随机数的函数或类。

例如,在Python中,你可以使用`secrets` 模块来生成密码学安全的随机数。

4. 硬件随机数生成器:某些计算机系统具有硬件随机数生成器,可以提供高质量的随机数。

这些硬件设备通常与操作系统集成,可以通过`/dev/hwrng` 或其他设备文件来访问。

请注意,在使用密码学随机数时,确保使用适当的生成方法,并避免使用不安全的伪随机数生成器。

密码学随机数对于密码学和安全应用非常关键,因此要确保你的随机数生成方式足够安全。

伪随机数的生成

伪随机数的生成

<cstdlib>头文件定义了一个生成随机整数的函数rand()。

Rand()函数把一个随机整数返回为int类型。

Rand()函数返回的值是从0到RAND_MAX之间的一个值。

RAND_MAX是一个在<cstdlib>中定义的符号。

在代码中使用RAND_MAX时,编译器会用一个整数值代替它。

在一些系统中,它表示值0x7fff,在另外一些系统中,它有不同的值,它至多可以是0x7fffffff。

数字序列的随机化:<cstdlib>中定义的srand()函数,例:std::srand(13);srand()函数的变元必须是unsigned int 类型的值,这条语句将会使rand()产生一个与默认不同的序列。

<ctime>标准库头文件定义了几个与日期和时间相关的函数。

例:time()函数,因为这就是获得随机种子值的方式。

Time()函数返回自从1970年1月1日以来过去的秒数。

伪随机数的产生:例:假定希望随机整数在0到10之间,就可以从rand()返回的值中得到如下结果:Const int limit=11;Int random_value=static_cast<int>((limit*static_cast<long>(std::rand()))/(RAND_MAX+1L));这里把0到RAND_MAX的取值范围分成limit部分,在给定的部分中,rand()返回的所有值都在0到limit-1的范围内。

具体方法是,把limit乘以rand()/(RAND_MAX+1L),除以(RAND_MAX+1L)而不是RAND_MAX(),是为了处理rand()正好返回RAND_MAX的情况。

如果除以RAND_MAX,结果就是limit,而不是limit-1。

如果希望随机值在1和某个上限之间,而不是下限为0,就应使用下面的代码:Const int limit=100;Intrandom_value=static_cast<int>(1L+(limit*static_cast<long>(std::rand()))/(RAND_MAX+1L));这里使用与前面相同的表达式生成0到limit-1之间的值,然后给它加1,得到1到limit之间的值。

shell 中32位随机值生成方法

shell 中32位随机值生成方法

shell 中32位随机值生成方法在Shell编程中,我们经常需要生成随机的值来使用。

生成32位的随机值可以有多种方法,本文将介绍两种常用的方法供参考。

方法一:使用/dev/urandom生成随机数/dev/urandom 是Linux系统中一个伪随机数生成器,可以用来生成高质量的随机数。

我们可以使用这个设备文件来生成32位的随机数。

下面是一个示例代码:```bashrandom_value=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)echo $random_value```上述代码的执行结果将会输出一个包含大小写字母和数字的32位随机值。

下面是代码的解析:- `cat /dev/urandom`:读取 /dev/urandom 设备文件,其中包含了随机的字节流。

- `tr -dc 'a-zA-Z0-9'`:删除字节流中的非字母和数字的字符。

- `fold -w 32`:将字符流每32个字符折叠为一行。

- `head -n 1`:选择第一行作为随机值。

方法二:使用openssl生成随机数同时,我们也可以使用openssl命令来生成32位的随机值。

下面是一个示例代码:```bashrandom_value=$(openssl rand -hex 16)echo $random_value```上述代码使用openssl命令的rand选项来生成一个长度为16字节的随机数。

由于每字节对应两个十六进制字符,所以结果将会是32位随机值。

这两种方法都可以满足生成32位随机值的需求,您可以根据实际情况选择适合的方法。

在实际使用中,请注意保护生成的随机值,避免被非法获取或篡改。

总结本文介绍了在Shell编程中生成32位随机值的两种常用方法:使用/dev/urandom设备文件和openssl命令。

LinuxShell生成随机数和随机字符串的方法示例

LinuxShell生成随机数和随机字符串的方法示例

LinuxShell⽣成随机数和随机字符串的⽅法⽰例⽇常⽣活中,会经常⽤到随机数,使⽤场景⾮常⼴泛,例如买彩票、丢骰⼦、抽签、年会抽奖等。

Shell 下如何⽣成随机数呢,⽶扑博客特意写了本⽂,总结 Linux Shell 产⽣随机数的多种⽅法。

计算机产⽣的的只是“伪随机数”,不会产⽣绝对的随机数(是⼀种理想随机数)。

实际上,伪随机数和理想随机数也是相对的概念,例如伪随机数在1万万亿亿亿年内也⽆法重复,算是理想随机数么?伪随机数在⼤量重现时也并不⼀定保持唯⼀,但⼀个好的伪随机产⽣算法将可以产⽣⼀个⾮常长的不重复的序列,例如UUID(通⽤唯⼀识别码)在100亿年内才可⽤完。

1. 使⽤系统的 $RANDOM 变量(CentOS、Ubuntu、MacOS 都⽀持,但只有5位数随机)mimvp@ubuntu:~$ echo $RANDOM17617$RANDOM 的范围是 [0, 32767]⽰例:使⽤ for 循环来验证:#!/bin/bash# 2016.05.10function print_random() {for i in {1..10};doecho -e "$i \t $RANDOM"done}print_random运⾏结果:# sh mimvp_shell_rand.sh1 201912 168173 259714 14895 346 251837 9208 3159 1884510 29519如需要⽣成超过32767的随机数,可以⽤以下⽅法实现(有缺陷)例:⽣成 40,000,000~50,000,000 的随机数,但最后末尾五位数在随机变化,实现原理有缺陷#!/bin/bash# 2016.05.10## Linux 系统随机数 + 范围上限值后, 再取余function mimvp_random_bignum() {min=$1max=$2mid=$(($max-$min+1))num=$(($RANDOM+$max)) # 随机数+范围上限, 然后取余randnum=$(($num%$mid+$min)) # 随机数包含上下限边界数值echo $randnum}function print_random_bignum() {for i in {1..10};dobignum=$(mimvp_random_bignum 40000000 50000000)echo -e "$i \t $bignum"done}print_random_bignum运⾏结果:# sh mimvp_shell_rand.sh1 400224222 400142613 400227124 400166955 400265756 400321987 400266678 400160249 4001201010 40016143这⾥,还可以通过 awk 产⽣随机数,最⼤为6位随机数,其跟时间有关,系统时间⼀致则随机数都相同,没有 $RANDOM 随机性好# awk 'BEGIN{srand(); print rand()}'0.739505# awk 'BEGIN{srand(); print rand()*1000000}'8557672. 使⽤date +%s%N(CentOS、Ubuntu⽀持,MacOS不⽀持纳秒 +%N)通过 Linux / Unix 的时间戳来获取随机数# date +%S # 获取秒数, 2位数43# date +%s # 获取时间戳, 10位数, 从 1970-01-01 00:00:00 到当前的间隔的秒数1548739004# date +%N # 获取纳秒值, 9位数, CentOS、Ubuntu⽀持, 但 MacOS 不⽀持468529240说明:如果⽤时间戳 date +%s 做随机数,相同⼀秒的数据是⼀样的。

linux随机数的合理取值方法。

linux随机数的合理取值方法。

linux随机数的合理取值方法。

Linux中可以使用/dev/random或/dev/urandom设备获取随机数,但这些设备可能受到系统熵池的限制,如果系统熵池不足,获取到的随机数可能不够随机。

因此,可以使用以下方法来提高随机数的随机性:
1.使用较大的随机数范围。

例如,使用rand()函数产生一个5位随机数,而不是一个2位随机数。

2.使用多个随机数源。

例如,除了使用/dev/random和/dev/urandom设备外,还可以使用鼠标移动、键盘输入、系统负载等其他因素的熵池。

3.使用熵加密算法。

例如,使用AES加密算法对获取的随机数进行加密处理,以增加随机数的随机性。

4.使用哈希函数。

例如,使用SHA1或MD5哈希函数对获取的随机数进行哈希处理,以增加随机数的随机性。

需要注意的是,生成的随机数并不是完全随机的,而是具有伪随机性质的数。

因此,需要在保证随机性的前提下,根据具体应用的需要确定随机数的取值范围。

伪随机数生成算法代码 -回复

伪随机数生成算法代码 -回复

伪随机数生成算法代码-回复【伪随机数生成算法代码】伪随机数生成算法是一种通过既定的算法和种子值来模拟真随机数序列的生成过程。

它在计算机科学和统计学等领域中广泛应用,并被用于模拟、密码学、随机化算法等领域。

以下是一个基于线性同余法的伪随机数生成算法代码:pythonseed = 0 初始化种子值def pseudo_random():global seeda = 22695477 乘数m = 232 模数c = 1 增量seed = (a * seed + c) m 更新种子值return seed生成随机数序列示例for _ in range(10):print(pseudo_random())在上述代码中,`seed`代表种子值,是一个存储当前随机数状态的变量。

`pseudo_random`函数是主要的伪随机数生成器,它基于线性同余法计算生成随机数。

其中,`a`、`m`和`c`是预先定义的常数,用于控制随机数生成的产生规则。

下面,我们将逐步解析这个伪随机数生成算法的工作原理。

1. 初始化种子值:`seed = 0`。

由于随机数生成需要一个初始值作为起点,我们选择0作为种子值。

2. 定义常数:`a`、`m`和`c`。

`a`是乘法的乘数,`m`是模数,`c`是增量。

这些常数的选择是根据具体需求和算法特性进行调整的。

3. 生成随机数:伪随机数生成器的核心逻辑是`seed = (a * seed + c) m`。

它通过不断地更新种子值,生成下一个随机数。

乘法和加法是线性同余法的两个要素,``运算符是用来确保生成的数范围在0到`m-1`之间。

4. 返回随机数:`return seed`语句将生成的随机数作为结果返回。

通过以上步骤,我们就得到了一个简单的基于线性同余法的伪随机数生成器。

接下来,我们来讨论一些与这个算法相关的注意事项和改进方法。

首先,伪随机数生成算法是依赖于种子值的。

不同的种子值将产生不同的随机数序列。

linux 随机数算法

linux 随机数算法

linux 随机数算法
Linux提供了多种随机数算法,其中最常用的是/dev/random和/dev/urandom。

/dev/random是一个阻塞设备,当应用程序请求产生随机数时,如果熵池中没有足够的随机数可用,/dev/random会等待,直到有足够的随机数产生。

这种阻塞方式确保了生成的随机数具有较高的随机性,但也可能导致应用程序在等待过程中出现延迟。

/dev/urandom是一个非阻塞设备,当应用程序请求产生随机数时,如果熵池中没有足够的随机数可用,/dev/urandom会使用一个伪随机数生成算法生成新的随机数。

这种方式可以保证随机数的可用性,但可能降低了生成的随机数的真正随机性。

Linux还提供了一些伪随机数生成器库函数,如rand()、random()和srandom()等。

这些函数使用一种确定性算法生成伪随机数,当随机数种子相同时,生成的随机数序列也是相同的。

为了增加真随机性,可以结合使用/dev/random和/dev/urandom设备及伪随机数生成器库函数,以满足不同应用对随机数的需求。

linux系统产生随机数的6种方法

linux系统产生随机数的6种方法

linux系统产⽣随机数的6种⽅法⽅法⼀:通过系统环境变量($RANDOM)实现:[root@test ~]# echo $RANDOM11595[root@test ~]# echo $RANDOM21625RANDOM的随机数范围为0~32767,因此,加密性不是很好,可以通过在随机数后增加加密字符串(就是和密码⽣成有关的字符串)的⽅式解决,最后再⼀起执⾏md5sum操作并截取结果的后n位,这样⼀来,就⽆法根据随机范围0~32767猜出具体结果了。

⽰例:[root@test ~]# echo "$RANDOM"|md5sum|cut -c 5-154eaf70019cc⽅法⼆:通过openssl产⽣随机数,⽰例:[root@test ~]# openssl rand -base64 8yB0maNWRoQw=令数字与⼤⼩写字符相结合,并带上特殊字符,可以达到很长的位数,这样的随机数很安全。

⽅法三:通过时间(date)获取随机数,⽰例:[root@test ~]# date +%s%N1523402619479946400[root@test ~]# date +%s%N1523402622015235600⽅法四:通过/dev/urandom配合chksum⽣成随机数:[root@test ~]# head /dev/urandom|cksum2866845253 2890[root@test ~]# head /dev/urandom|cksum2131526544 2440/dev/random设备存储着系统当前运⾏环境的实时数据。

它可以看作系统在某个时候的唯⼀值,因此可以⽤作随机元数据。

我们可以通过⽂件读取的⽅式,读到⾥⾯的数据。

/dev/urandom这个设备的数据与random⾥的⼀样。

只是,它是⾮阻塞的随机数发⽣器,读取操作不会产⽣阻塞。

⽅法五:通过UUID⽣成随机数,⽰例:[root@test ~]# cat /proc/sys/kernel/random/uuidc984eb24-9524-4b07-af80-8b18b5a1b530[root@test ~]# cat /proc/sys/kernel/random/uuid28274c2f-c03b-4c6a-9bd2-d20b594972a4UUID码全称是通⽤唯⼀识别码(Universally Unique Identifier,UUID)它是⼀个软件建构的标准,亦为⾃由软件基⾦会的组织在分布式计算环境领域的⼀部分;UUID的⽬的是让分布式系统中的所有元素都能有唯⼀的辨别信息,⽽不需要通过中央控制端来做辨别信息的指定,如此⼀来,每个⼈都可以创建不与其他⼈发⽣冲突的UUID,在这种情况下,就不需要考虑数据库创建时的名称重复问题了,它会让⽹络中任何⼀台计算机所⽣成的UUID码都是互联⽹整个服务器⽹路中唯⼀的编码。

伪随机码的生成及自相关函数的计算

伪随机码的生成及自相关函数的计算

伪随机码的生成及自相关函数的计算1.函数seq=ms_generator(registers,connections)是m序列的生成函数,其中参数registers给出了以为寄存器的初始状态,connections给出了m序列的发生器。

m序列生成的程序如下:function seq=ms_generator(registers,connections)registers=[0 0 0 0 1];connections=[1 0 0 1 0 1];n=length(connections);L=2^(n-1)-1;seq(1)=registers(n-1);for i=2:L;sum=0;for m=1:(n-1)sum=mod(sum+registers(m)*connections(m+1),2);endfor k=(n-1):-1:2registers(k)=registers(k-1);endregisters(1)=sum;seq(i)=registers(n-1);sprintf('seq=%d',seq(i));End运行结果:ans =Columns 1 through 151 0 0 0 0 1 0 0 1 0 1 1 0 0 1Columns 16 through 301 1 1 1 0 0 0 1 1 0 1 1 1 0 1Column 31(2)函数auto_corr()计算二进制序列seq的自相关函数,并画出函数曲线。

程序代码如下:function auto_correlation=auto_corr(seq)registers=[1 0 0 0 0];connections=[1 0 1 0 0 1];seq=ms_generator(registers,connections);seq=-1*(seq*2-1);len=length(seq);temp=[seq seq];for i=0:len-1auto_correlation(i+1)=seq*(temp(i+1:i+len))';endauto_correlation;plot(0:len-1,auto_correlation);运行结果:ans =Columns 1 through 1531 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1Columns 16 through 30-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1Column 31-1函数曲线图:(3)函数cross_corr()计算二进制序列seq1和seq2的互相关函数。

Linux_Shell_实现随机数多种方法

Linux_Shell_实现随机数多种方法

Linux Shell 实现随机数多种方法在日常生活中,随机数实际上经常遇到,想丢骰子,抓阄,还有抽签。

呵呵,非常简单就可以实现。

那么在做程序设计,真的要通过自己程序设计出随机数那还真的不简单了。

现在很多都是操作系统内核会提供相应的api,这些原始参数是获取一些计算机运行原始信息,如内存,电压,物理信号等等,它的值在一个时间段可以保证是唯一的了。

好了,废话我就不说了。

呵呵。

shell脚本程序我们有那些获得随机数方法呢?一、通过时间获得随机数(date)这个也是我们经常用到的,可以说时间是唯一的,也不会重复的,从这个里面获得同一时间的唯一值。

适应所有程序里面了。

例子:1 2 3 4 5 6 7 8 9 10 11 12 13[chengmo@centos5 shell]$ date +%s1287764773#获得时间戳,当前到:1970-01-01 00:00:00 相隔的秒数#如果用它做随机数,相同一秒的数据是一样的。

在做循环处理,多线程里面基本不能满足要求了。

[chengmo@centos5 shell]$ date +%N738710457#获得当前时间的纳秒数据,精确到亿分之一秒。

#这个相当精确了,就算在多cpu,大量循环里面,同一秒里面,也很难出现相同结果,不过不同时间里面还会有大量重复碰撞[chengmo@centos5 shell]$ date +%s%N1287764807051101270#这个可以说比较完美了,加入了时间戳,又加上了纳秒通过上面说明,用它来做随机数的基数了,接下来我们看怎么样获得一段数据内怎么样获得随机数。

1 2 3 4 5 6 7 8#!/bin/sh#写个随机函数,调用方法random min max#在min 与 max直接获得随机整数#copyright chengmo QQ:8292669#获得随机数返回值,shell函数里算出随机数后,更新该值9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26function random(){min=$1;max=$2-$1;num=$(date +%s+%N);((retnum=num%max+min));#进行求余数运算即可echo $retnum;#这里通过echo 打印出来值,然后获得函数的,stdout就可以获得值#还有一种返回,定义全价变量,然后函数改下内容,外面读取}#得到1-10的seq数据项for i in {1..10};doout=$(random 2 10000);echo $i,"2-10000",$out;done;看看运行结果:[chengmo@centos5 shell]$ sh testrandom.sh1,2-10000,56002,2-10000,52953,2-10000,34324,2-10000,31485,2-10000,90416,2-10000,42907,2-10000,23808,2-10000,90099,2-10000,547410,2-10000,3664一个循环里面,得到值各不相同。

详解Linux如何生成随机数字和字符串

详解Linux如何生成随机数字和字符串

详解Linux如何⽣成随机数字和字符串⽣成随机数字1.使⽤系统的$RANDOM变量> echo $RANDOM145872.使⽤date +%s%N> date +%s%N15295840248965872593.使⽤/dev/random 或 /dev/urandom/dev/random存储着系统当前运⾏环境的实时数据,是阻塞的随机数发⽣器,读取有时需要等待,尽量避免使⽤。

/dev/urandom⾮阻塞随机数发⽣器,读取操作不会产⽣阻塞。

> cat /dev/urandom | head -n 10 | cksum | awk -F ' ' '{print $1}'1198074148⽣成随机字符串1.使⽤linux uuid,uuid全称是通⽤唯⼀识别码,格式包含32个16进制数字,以'-'连接号分为5段。

形式为8-4-4-4-12 的32个字符。

> cat /proc/sys/kernel/random/uuid6fcae1aa-ab46-435a-8531-250ccb54ed8e2.使⽤md5sum#使⽤date ⽣成10位随机字符串> date +%s%N | md5sum | head -c 10bb791e69d4#使⽤ /dev/urandom⽣成10位随机字符串> cat /dev/urandom | head -n 10 | md5sum | head -c 10909587db4c> head -c 10 /dev/random | base64tBIDqQcaQ+qvkA==3.使⽤openssl> openssl rand -hex 103822e40bdcc2d1c6ee5f以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

伪随机数公式

伪随机数公式

伪随机数公式伪随机数这玩意儿,在数学和计算机领域里可是个挺有意思的存在。

咱先来说说啥是伪随机数。

简单讲,伪随机数并不是真正完全随机产生的数,而是通过一定的公式或者算法算出来的看起来像是随机的数。

比如说,在一些电脑游戏里,怪物出现的位置、掉落物品的种类,很多时候都是靠伪随机数来决定的。

我记得有一次我玩一个打怪升级的游戏,老是在同一个地方碰到特别厉害的怪物,一开始我还以为自己运气太差,后来才知道这都是伪随机数在“捣鬼”。

那伪随机数公式是怎么回事呢?常见的一种伪随机数生成公式是线性同余法。

它大概是这样的:X(n + 1) = (a * X(n) + c) mod m 。

这里面的 a、c、m 都是事先设定好的参数,X(0) 是初始值。

通过不断地迭代这个公式,就能得到一系列的数。

这公式看起来可能有点复杂,但其实道理不难懂。

就好比你有一个初始的种子(也就是 X(0)),然后通过一套固定的规则(就是公式里的运算),让这个种子不断地“生长”,长出一串数字来。

在实际应用中,伪随机数公式可太有用了。

比如说在模拟实验里,如果要模拟扔骰子的情况,就可以用伪随机数来生成每次扔骰子的结果。

还有啊,在密码学里,伪随机数也能发挥大作用。

为了保证信息的安全传输,加密和解密过程中都会用到伪随机数。

不过,伪随机数也有它的局限性。

因为它不是真正的随机,所以如果使用不当,可能会出现一些规律,被有心之人发现和利用。

就像我之前参加一个数学建模比赛,我们小组要用伪随机数来模拟市场的波动情况。

一开始觉得挺顺利的,结果后来仔细分析数据,发现有一些微妙的规律,这可把我们急坏了,赶紧重新调整算法和参数。

总之,伪随机数公式虽然不是完美的随机,但在很多情况下,它已经能很好地满足我们的需求,给我们的生活和工作带来很多便利和惊喜。

只要我们了解它的特点,合理运用,就能让它为我们服务,而不是给我们添麻烦。

希望通过我这一通不太专业但还算实在的讲解,能让您对伪随机数公式有个初步的认识和了解。

随 机 数 生 成 器

随 机 数 生 成 器

随机数生成器与线性同余法产生随机数1、随机数生成器与-dev-random:随机数生成器,顾名思义就是能随机产生数字,不能根据已经产生的数预测下次所产生的数的“器”(器存在软件与硬件之分),真正的随机数生成器其产生的随机数具有随机性、不可预测性、不可重现性。

什么是真正的随机数生成器?指的是由传感器采集设备外部温度、噪声等不可预测的自然量产生的随机数。

比如Linux的-dev-random设备文件其根据设备中断(键盘中断、鼠标中断等)来产生随机数,由于鼠标的操作(移动方向、点击)是随机的、不可预测的也是不可重现的,所以产生的随机数是真随机数。

-dev-random即所谓的随机数池,当通信过程(如https安全套接层SSL)需要加密密钥时,就从随机数池中取出所需长度的随机数作为密钥,这样的密钥就不会被攻击者(Attacker)猜测出。

但是由于-dev-random是采集系统中断来生成随机数的,所以在无系统中断时,读取-dev-random是处于阻塞状态的,如下所示(鼠标移动与否决定了cat -dev-random的显示结果,cat -dev-random | od -x先显示的4行是查看该设备文件前,系统中断被采集而产生的随机数,而之后的随机数则是鼠标移动锁产生的随机数):cat读取-dev-radom测试效果.gif在Linux上还存在随机数生成器-dev-urandom,而读取该随机数池是不会阻塞的,因为其不受实时变化的因素影响,所以-dev-urandom是一个伪随机数生成器,而C语言的rand()库函数所产生的随机数也是伪随机数。

-dev-random与-dev-urandom的区别在于一个阻塞一个非阻塞,一个更安全一个较安全。

对于-dev-random来说,如果需要的随机数长度小于随机数池中的随机数,则直接返回获取到的随机数,并且池中的随机数长度减去获取长度,如果要获取的随机数长度大于池中已有的长度,则获取的进程处于阻塞状态等待新的生成的随机数部分注入池中。

简道云函数举例:固定长度的随机串号(伪随机)

简道云函数举例:固定长度的随机串号(伪随机)

简道云函数举例:固定长度的随机串号(伪随机)
简道云提供了一个生成8-4-4-4-12位随机码的函数----UUID()。

生成的序列如:
b8a00836-7740-466d-ac9f-0447404ee7fd。

以数字和小写字母构成,分别是8-4-4-4-12位,用短线相连。

和RECNO()一样,每次打开表单,就自动生成了这样的一个随机序列。

这样的32位的字符串是永远不会重复的,但是不一定会满足用户的需要。

有的用户需要
短一些的随机序列,用UUID()也可以做。

但是只能做到伪随机,不能保证一定不重复。

大家应该想到了,就是从这32位字符中截取一部分,来作为一个新的随机序列。

我想做一个10位随机序列,由大写字母和数字构成。

函数如下:
用到的函数:
RIGHT()
UPPER()
UUID()
函数为:UPPER(RIGHT(UUID(),10))
我们来看一看这个函数值:
注意:UUID()保证输出的32位字符串不会重复,不能保证从这32位字符串中截取的一部分也不重复,因此有需要不重复的用户,要勾选“不可重复”。

本文由:简道云--在线数据管理工具提供。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

=============================使用方法提要=============================
rand()、random() 返回的伪随机数都均匀分布在 0 ~ RAND_MAX 之间,
其中 RAND_MAX 是在头文件<stdlib.h>中定义的符号常量,通常就是signed int
在 Linux的 GCC 中,涉及到伪随机数生成器的函数声明位于 stdlib.h
rand系列——
int rand(void);
int rand_r(unsigned int *seedp);
void srand(unsigned int seed);
遵从标准SVID 3
BSD 4.3
不过其传递的种子仅为 unsigned int型,有限状态数太少。更好的线程安全的
伪随机数生成器是 drand48_r ,48位的种子传递。
Байду номын сангаас
就是说不要用“%”而用“/”运算:j= RANGE* rand() / (RAND_MAX+1.0) ;
这样将随机数范围从 [0, RAND_MAX] 也就是 [0, RAND_MAX+1.0)
缩放到 [0, RANGE) ,其中 RANGE 需要定义为浮点数,防止整型运算!
rand_r 函数用于在多线程程序中为每一个线程维护一个独立的伪随机数序列,
char *setstate(char *state);
仅遵从标准BSD 4.3
可见 random系列函数不是C语言的原生标准,属于BSD、GCC的扩展。
该扩展的最大目的是为了提供一种循环周期超长的伪随机数生成函数,因为
rand系列函数通常采用“乘同余”算法,循环周期小于 2**31 量级——尽管
ISO 9899
POSIX 1003.1-2003.
其中的 ISO 9899标准也就是 C语言的ISO标准系列号
random系列——
long int random(void);
void srandom(unsigned int seed);
char *initstate(unsigned int seed, char *state, size_t n);
其int型返回值均匀分布于 0 ~ 2**31-1 之间。而random系列函数使用了
“非线性增长-反馈”算法,实现了大约 16* (2**31) 量级的长周期。
当然,GCC的 rand函数也非(像 Visual C++那样)采用简单的乘同余算法,
而是“非线性增长-反馈”算法,其实就是 random函数!不过为了可移植性,
数据类型的上限。
首先要调用系统时间初始化: #include <time.h>
srand( (unsigned)time(NULL) );
或者 srandom( (unsigned)time(NULL) );
以下省略 random系列函数
尽可能使用随机数的高字节部分——
最低要求64位(同线性方法)。“有限状态自动机”的状态数目大大增加,
也就不容易发生循环。
不过,“非线性增长-反馈”算法的速度慢一些,但是超长周期的特点
使其可以连续生成伪随机数而不必频繁初始化;较快的线性方法因为要定期作
时间代价高昂的初始化操作,不便于快速产生超长串数据。另外,为了避免
自相关缺陷,需要使用一些技巧才能生成二维或者更高维随机点的坐标。
避免在其它平台上误用简单的rand函数而遇上麻烦,推荐使用 random函数!
★ ~~~~~~~~~~~~~~~~~~~~~~
++参考++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Excel绘制的散点图 rand.gif、random.gif,用连续伪随机数序列
按照 (a,b)、(c,d)、(e,f)、……方式确定二维正方区域中3000个点的坐标,
可见无论是 GCC-rand 还是 GCC-random 绘制出的散点图都未见自相关特征。
++对比+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
线性同余法还有一重要缺陷:低位数据 的随机性比 高位数据 差。
网上曾有人说 Visual C++ 的随机数生成器性能高于 GCC,那是因为
VC++ 用的是不可靠的简单“线性同余算法”,没有参考价值。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
所谓“非线性增长-反馈”算法,类似我曾经在《随机数及其生成器》
一文中给出的伪代码—— 乘同余法之所以循环周期短,是因为其每一步循环后
都只有一个变常数 next 被送往下一循环,即使是unsigned long next也不过
64位;而非线性算法使用的是 一组 变常数在循环间传递,可以高达2048位,
相关文档
最新文档