精华内容
下载资源
问答
  • 伪随机数

    2020-06-04 10:30:03
    伪随机数: 产生真正的随机数需要硬件支持和一些计算。 伪随机算法,可以在无硬件支持下产生貌似是随机的数,一般会有周期性,好处是计算的很快,代价小。坏处是如果在密码学上应用,可能会被攻击进而密码被破解。 ...

    伪随机数:
    产生真正的随机数需要硬件支持和一些计算。
    伪随机算法,可以在无硬件支持下产生貌似是随机的数,一般会有周期性,好处是计算的很快,代价小。坏处是如果在密码学上应用,可能会被攻击进而密码被破解。
    C语言中伪随机数,随机种子是根据系统时间确定的,同一个随机种子,产生的随机数的顺序是相同的,这也说明伪随机并不是真正的随机

    展开全文
  • 伪随机数C语言编程

    千次阅读 2018-06-10 22:38:03
    本文介绍在 Linux 编程环境下,如何生成伪随机数。 什么是伪随机数 伪随机数是通过一个确定性的算法计算出来的“似乎”是随机的数序,因此伪随机数实际上并不随机。在计算伪随机数时,假如初始值不变的话,那么...

    在程序设计中,有时会用到随机数。本文介绍在 Linux 编程环境下,如何生成伪随机数。

    什么是伪随机数

    伪随机数是通过一个确定性的算法计算出来的“似乎”是随机的数序,因此伪随机数实际上并不随机。在计算伪随机数时,假如初始值不变的话,那么伪随机数的数序也不变。

    伪随机数的优点

    要产生真正的随机数,必须使用专门的设备,比如热噪信号、量子力学效应、放射性元素的衰退辐射,或使用无法预测的现象等。而伪随机数计算比较简单,不需要外部特殊硬件的支持,因此在计算机科学中伪随机数依然被使用。

    伪随机数的缺点

    由于伪随机数不是真的随机数,在有些方面它们不能被使用。例如在密码学中使用伪随机数要小心,因为其可计算性是一个可以攻击的地方。统计学、蒙特·卡罗方法上使用的伪随机数也必须挑选周期极长、随机性够高的随机函数,以确保计算结果有足够的随机性。

    利用 rand() 函数生成伪随机数

    函数原型:

    //需要包含头文件 <stdlib.h>  
    int rand(void);

    Linux 中的rand()函数会返回一随机数值,其范围在0RAND_MAX 间。这里的RAND_MAX定义在stdlib.h中(如下图的128行所示),值为 2147483647(=2^31-1)。
    这里写图片描述

    以下例子利用 rand() 函数生成伪随机数。

    #include <stdlib.h>
    #include <stdio.h>
    
    #define RAND_NUM    5
    
    int main(int argc, char *argv[])
    {
        for(int i=0; i< RAND_NUM; ++i)
            printf( "%d ", rand() );
    
        printf("\n");
        return 0;
    }

    编译后连续运行两次,结果是:

    $ ./rand
    1804289383 846930886 1681692777 1714636915 1957747793 
    $ ./rand
    1804289383 846930886 1681692777 1714636915 1957747793

    为什么会这样呢?

    计算机产生的伪随机数是通过递推的方法得来的,必须要有一个初始值,也就是通常所说的种子。如果不对种子进行初始化,那么计算机会使用一个默认值。由于两次运行中初始值一样(都是默认值),递推公式也一样,所以才有完全一样的伪随机序列。

    对于rand()函数,如果未设随机数种子,rand()在被调用时会自动设随机数种子为1

    要想避免这种结果,就需要在每次程序运行时对种子进行初始化 ,且初始值不一样(比如到目前为止经过的时间 )。

    获取当前时间(以秒计算)

    函数原型:

    // 需要包含头文件 <time.h>   
    time_t time (time_t* timer);

    time_t其实是一个长整形。

    time_t time (time_t* timer)函数的用法是:

    当参数为NULL的时候,返回从1970年1月1日0时0分0秒到此时的秒数;当参数不为NULL的时候,不仅返回从1970年1月1日0时0分0秒到此时的秒数,还把返回值存储到参数指向的time_t类型的变量里。

    设置种子

    函数原型:

    // 需要包含头文件 <stdlib.h> 
    void srand (unsigned int seed);

    srand函数把种子值作为参数。结合函数time_t time (time_t* timer),我们可以这样设置种子:

    srand( (unsigned int)time(NULL) );

    参考代码

    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    #define RAND_NUM    5
    
    int main(int argc, char *argv[])
    {
        srand( (unsigned int)time(NULL) );
    
        for(int i=0; i< RAND_NUM; ++i)
            printf( "%d ", rand()%100 );
    
        printf("\n");
        return 0;
    }

    实验结果如下:

    $ ./rand
    61 71 64 35 13 
    $ ./rand
    50 11 83 43 69 
    $ ./rand
    68 32 35 94 83 

    【完】

    参考资料

    http://txgcwm.github.io/blog/2013/07/07/linuxxia-cyu-yan-wei-sui-ji-shu-bian-cheng/

    https://zh.wikipedia.org/wiki/%E4%BC%AA%E9%9A%8F%E6%9C%BA%E6%80%A7

    https://blog.csdn.net/duyiwuer2009/article/details/49497199

    http://www.cplusplus.com/reference/cstdlib/srand/?kw=srand

    http://blog.jobbole.com/108049/

    展开全文
  • C++ 伪随机数

    2020-09-20 22:57:16
    思路 ...伪随机数序列是用确定性的算法计算出来的遵循某种概率分布的序列,程序的运行过程是一个确定的过程,每一条指令都是确定, blue         blue blue   &n.

           

    真随机数

            自然界中的有很多不确定的物理现象,通过测量这些现象,就可以获得真随机数。比如白噪声的幅值、电子元器件的电压噪声等,真随机数可以通过用硬件对这些参数进行采集获得。

           

           

    伪随机数

            伪随机数序列是用确定性的算法计算出来的周期很长的序列。程序的运行过程是一个确定的过程,每一条指令都是确定的,因此不能产生真的随机数。
            说到伪随机数就会说到种子,什么是种子呢,我们可以将种子理解为一个初始值,特定算法根据这个初始值产生一个一定的序列,生成的这个序列“看起来”是随机的,实际上是一个周期很长的确定序列。如果每次的种子设置得相同,那么产生的序列都是相同的。
            举个例子,我们可以简单的设置这个种子为某个数,比如1。请看如下代码,用srand()设置种子的值用rand()产生伪随机数序列,需要包含头文件#include <stdlib.h>。重复运行下列代码,因为种子相同,所以每次输出的序列都是如图的序列"41 18467 6334 26500 …"。

    srand(1);   // 设置种子的值为1,如果不设置,默认种子为1
    for (int i = 0; i < 10; ++i) {
        cout << rand() << " ";	// 输出10个伪随机数
    }
    

           

           

            如果每次种子设置得不同,那生成的序列也将不同。 如何获得不同的种子呢?
           可以用C语言中的库函数 time_t time(time_t *seconds) 返回自1970-01-01 00:00:00 UTC 起经过的时间,以秒为单位。这个函数的入参seconds也能保存结果,请看如下代码,输出的t和seconds的值是一样的。

        time_t seconds;
        time_t t=time(&seconds);
        cout << t <<" "<< seconds <<endl;  // t和seconds的值是一样的
    

           那么,我们将当前的时间设置为种子,由于时间一直在变,种子就一直在变,每次就能生成不同的伪随机数序列。

    time_t t=time(nullptr);
    srand(t);   // 设置种子的值为时间
    for (int i = 0; i < 10; ++i) {
        cout << rand() << " ";
    }
    

           

           

    C++代码示例

    题目:将1-100的有序序列变成无序序列,要求每次运行的结果不同。

    // 题目:将1-100的有序序列变成无序序列,要求每次运行的结果不同。
    
    void fun(vector<int> &vec) {
        time_t t = time(nullptr);
        srand(t);   // 设置种子的值为时间
        rand();
        for (int i = 0; i < 500; ++i) {
            // 每次随机交换数组中的两位
            swap(vec[rand() % 100], vec[rand() % 100]);
        }  
    }
    
    int main() {
        vector<int> vec(100);
        for (int i = 0; i < 100; ++i) {
            vec[i] = i+1;
        }
        fun(vec);
        for (auto it : vec) {
            cout << it << " ";
        }
        cout << endl;
        system("pause");
    }
    

           

    展开全文
  • 伪随机数的攻击

    千次阅读 2018-10-13 16:40:17
    和密码相比,伪随机数生成器实在是很少被人们所注意,因此我们很容易忘记伪随机数生成器也可以受到攻击的。然而,由于伪随机数生成器承担了生成密钥的重担,因此它经常成为攻击者的对象。 二 对种子进行攻击 ...

    一 点睛

    和密码相比,伪随机数生成器实在是很少被人们所注意,因此我们很容易忘记伪随机数生成器也可以受到攻击的。然而,由于伪随机数生成器承担了生成密钥的重担,因此它经常成为攻击者的对象。

    二 对种子进行攻击

    伪随机数的种子和密码的密钥同等重要。如果攻击者知道了伪随机数的种子,那么他就能够知道这个伪随机数所生成的全部伪随机数列。因此,伪随机数的种子是不可以被攻击者知道。

    要避免种子被攻击者知道,我们需要使用不可重现的真随机数作为种子。

    三 对随机数池进行攻击

    当然,我们一般不会到了需要的时候才当场生成真随机数,而是会事先在一个名为随机数池的文件中记录随机比特序列。当密码软件需要伪随机数种子时,可以从这个随机池中取出所需长度的随机比特序列来使用。

    随机数池的内容不可以被攻击者知道,否则伪随机数的种子就有可能被预测出来。

    随机数池本身并不存储任何有意义的信息。我们需要保护没有任何意义的比特序列,这一点违背常识,但其实却是非常重要的。

    展开全文
  • 伪随机数生成器

    千次阅读 2018-10-13 11:48:03
    一 点睛 随机数可以通过硬件来生成,也可以通过软件来生成。 通过硬件生成的随机数列,是根据传感器收集的热量、声音的变化等事实上无法预测...伪随机数生成器具有“内部状态”,并根据外部输入的“种子”来生成...
  • Random伪随机数

    2019-05-17 08:11:24
    Random伪随机数 开发工具与关键技术:My Eclipse 10、Java 作者:郑凯丰 撰写时间:2019年5月16日 解释:用Random写三种随机数,然后你就会发现Random伪随机数其实也是有规律的,当同事写多个Random方法的时候就会...
  • PHP的伪随机数爆破

    2020-07-12 20:00:08
    伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。 怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;...
  • C++伪随机数

    千次阅读 2018-06-21 09:45:46
    rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。srand(unsigned seed)通过...
  • 伪随机数算法

    万次阅读 多人点赞 2017-05-03 21:46:14
    伪随机数概念在我大学一年级接触C语言基础的时候就听说过,并熟练掌握C语言中rand()函数的使用方法。不过,当时我对伪随机数的认识基本也就停留在百度百科那种小白水平,最多就知道老师说我们用的随机数是假的,是...
  • C语言的伪随机数

    千次阅读 2017-08-22 16:00:37
    一直想好好的系统的学习一下C语言的伪随机数,今天终于逮到机会了 伪随机数 C语言中有可以产生随机数据的函数,需要添加stdlib.h和time.h头文件。首先在main函数开头加上srand(unsigned)time(NULL))。 先来介绍...
  • matlab——伪随机数生成

    千次阅读 2019-11-13 19:30:27
    rand(m) 用于生成m行m列均匀分布在(0,1)之间的伪随机数 实现 >> rand(5) ans = 0.8147 0.0975 0.1576 0.1419 0.6557 0.9058 0.2785 0.9706 0.4218 0.0357 0.1270 0.5469 0.9572 0....
  • 今天给大侠带来在FPGA设计中,产生LFSR伪随机数,话不多说,上货。 一、概述 通过一定的算法对事先选定的随机种子(seed)做一定的运算可以得到一组人工生成的周期序列,在这组序列中以相同的概率选取其中...
  • 伪随机数的生成

    千次阅读 2017-12-25 15:29:44
    伪随机数的生成 随机序列具有的性质: 等分布性,随机序列的分布特性是等概分布,或称为一致分布。即是说序列中每个元素出现的概率都是相等的。 独立性:随机序列的各个元素之间是相互独立的。 不可预测性:该...
  • 真随机数和伪随机数

    千次阅读 2019-03-15 17:34:37
    随机数的特性 ...真随机数和伪随机数 真随机数  真随机数是伴随着物理实验的,比如:抛硬币、掷骰子、电子元件的噪音、核裂变等,它的结果符合三大特性的。  具体实现:intel通过电阻和振荡器生成...
  • python random- 生成伪随机数

    千次阅读 2018-08-01 00:39:54
    9.6. random- 生成伪随机数 源代码: Lib / random.py 该模块为各种分布实现伪随机数生成器。 对于整数,从范围中有统一的选择。对于序列,存在随机元素的统一选择,用于生成列表的随机排列的函数,以及用于...
  • 随机数种子 + 伪随机数生成器 = 伪随机数生成 同样的随机数种子和同样的生成器总是生成同样的序列。 伪随机数是有周期的,多次运行后结果会出现重复。 真正的随机数必须使用专门的设备,比如热噪信号、量子力学的...
  • CTF中的伪随机数

    2020-11-13 11:08:19
    mt_rand()函数的默认范围是0到mt_getrandmax()之间的伪随机数 有这么多 存在漏洞 相同的种子生成的随机数是相同的 推荐一个工具 看这里 所以 漏洞来了 知道种子后,可以确定输出伪随机数的序列。 知道随机数序列...
  • JAVA的伪随机数

    千次阅读 2019-05-08 16:45:17
    今天要讲的是Random生成的随机数是伪随机数,为什么说Random生成的随机数是伪随机数?是因为只要两个Random对象的种子相同,而且方法的调用顺序也相同,产生的随机数相同。我们来看一下。 首先第一步:创建一个 ...
  • 随机数种子与伪随机数生成原理

    千次阅读 2018-02-04 17:02:36
    1.伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。 2.随机种子来自系统时钟,确切地说,是来自计算机主板上的定时/计数器在内存中的记数值。 3.随机数是...
  • Golang的伪随机数

    千次阅读 2018-08-21 16:04:56
    在 GoLang 中,我们可以通过 math/rand 包里的方法来生成一个伪随机数: package main import ( "fmt" "math/rand" ) func main() { fmt.Println(rand.Int()) // =&gt; 134020434 } ...
  • FPGA项目开发:基于FPGA的伪随机数发生器(附代码) 今天是画师和各位大侠见面了,执笔绘画FPGA江湖,本人写了篇关于FPGA的伪随机数发生器学习笔记,这里分享给大家,仅供参考。 一、概念 随机数是专门的随机试验...
  • 基于JDK1.8详细介绍了ThreadLocalRandom伪随机数生成器的原理,以及对Random的优化!
  • 此处讨论的随机种子适用... 但是,当你新打开一个程序时,没有由上一个伪随机数生成器产生的值,这时系统就会为你定一个初始值(可能根据日期,时间啥的,可以认为是无法被推断的),通过这个值你可以一路往下走。 ...
  • 随机种子与伪随机数

    2017-06-21 15:19:37
    随机种子:为了产生伪随机数序列的基础数 例如:想x(n+1) = a*x(n) + b中,x(0)可以看做是随机序列的随机种子,x(0)不同,产生的随机数不同

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 87,180
精华内容 34,872
关键字:

伪随机数