美文网首页算法编程程序员
不一样的随机数生成方法(C/C++)

不一样的随机数生成方法(C/C++)

作者: 肥宅_Sean | 来源:发表于2017-11-28 15:11 被阅读36次

在网上查随机数生成,大家基本都是大同小异的,而且还不是很方便(这个如果你只是想要生成一个随机数什么的,那也无所谓,还能凑合着用那种方法)。

用C++写的,但是C要用就把 ctime写成time.h ,cstdlib写成stdlib.h
C++的随机数生成本质上是用C的库实现的,你看库名字就知道了....

但是不够好的是,如果如果我要生成多个随机数的时候,那么我就要设置一个种子,srand,一般呢,就是用时间去波动它。导致时序不同的地方生成一个的随机数。
一般代码如下:(熟手的话,很容易就打完下面的代码了)

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int RandNumber(int begin = 0, int end = 1) {
    return (rand()%(end-begin+1))+begin;
} 
int main(){
    srand(time(0));
    for (int i = 0; i < 10; ++i){
        cout << RandNumber(1,5)<<endl;
    }
    return 0;
}

但是仔细看的话,发现这样其实是不够好的
这个不够好,是在代码格式上的。
要是进行一个大的规模的的程序。你放一个种子在main函数或者其他什么函数中,这样肯定是不好的嘛!(在逻辑上过不去,打码久了就能很容易体会到这一点)
这样封装起来就不够严密了嘛。
所以呢?好的解决方法是什么呢?
我想到了一个,就是构建一个类。
为什么要构建类呢?
对于每一个类,都可以在构造函数中构建一次随机数种子。
这样,由于一个随机数种子会对应一个随机数。再由于时间在波动,所以,就可以更新随机数。
同样可以增加代码的重用。可以说是一个非常好的程序员思维。
举个反例,一般对随机数不太熟的人都会遇到生成的随机数是相等的
典型错误就包括下面这种(下面代码确保了重用但是....)

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int RandNumber(int begin = 0, int end = 1) {
    srand(time(0));
    return (rand()%(end-begin+1))+begin;
} 
int main(){
    for (int i = 0; i < 10; ++i){
        cout << RandNumber(1,5)<<endl;
    }
    return 0;
}

虽然你确实生成了一个随机数,但是不得不说的是,你每次生成的随机数都是一样的.....
像上面那个代码运行的结果,每次都可能是1到5之间的任意的一个数,但输出的这个10个数都是一样的....对比第一代码,可以看出srand的位置的不同(虽然长得有点像)

生成展示1

但是用类就没有这方面的考虑了。

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
class RandomNumber{
public:
    RandomNumber(){
        srand(time(0));
    }
    int get(int begin = 0, int end = 1){
        return rand()%(end-begin+1)+begin;
    }
}; 
int main(){
    RandomNumber r,t;
    for (int i = 0; i < 10; ++i) {
        cout << r.get(1, 5)<<" "<< t.get(1, 5)<< endl;
    }
}

为了确保自己设计没有问题,我还特意写了两个变量来运行。
这样说可以做了一个重用的随机数了。
(而我这个代码,就有点生成器的味道了(接触过Python的朋友应该能感受到))
要是有小哥哥愿意做一个输入流,这样就可以做一个很酷的像int一样的类,直接cout,可以说是非常酷了。


生成展示2

上面就是之前那个代码的运行结果。

相关文章

  • C++生成随机数据方法

    生成随机int数组方法(数据未知) 生成随机Int序列(给定数据) 生成随机序列(给定数据)--模板函数

  • C++随机数

    C++ 随机数 在许多情况下,需要生成随机数。关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返...

  • C++产生随机数

    今天用C++实现一个调度算法,需要生成随机数,于是我立刻想到了经典的C的实现方法: 但是在实际的工程中,可能涉及到...

  • c/c++生成随机数

    rand() 生成一个0~RAND_MAX的随机数 RAND_MAX的范围最少是在32767之间(int)。用un...

  • Linux shell下生成随机数

    本文只讨论在shell下生成随机数,不包括在C/C++等程序语言中的做法。 $RANDOM RANDOM是bash...

  • c++生成随机数

    一.获取均匀分布的随机数###经典方法: rand的机制是根据一个随机数种子(通常是一个整数值,如果没有设置,则为...

  • 不一样的随机数生成方法(C/C++)

    在网上查随机数生成,大家基本都是大同小异的,而且还不是很方便(这个如果你只是想要生成一个随机数什么的,那也无所谓,...

  • JNI的语法

    1.在C/C++中实现本地方法 生成C/C++头文件之后,你就需要写头文件对应的本地方法。注意:所有的本地方法的第...

  • c++ 11中的随机数 ——random

    背景 C 和 C++ 都依赖一个简单的 C 库函数 rand 来生成随机数rand 函数有一些问题:即使不是大多数...

  • C#调用OpenCV函数的实现

    C#调用OpenCV函数的实现步骤:1、C++编写调用OpenCV函数的方法,编译成dll;2、C#引用C++生成...

网友评论

    本文标题:不一样的随机数生成方法(C/C++)

    本文链接:https://www.haomeiwen.com/subject/mbfebxtx.html