iMatlab

爱学习,爱Matlab

【转】C++产生随机数(应用rand函数)



苦逼而快乐的程序猿。

<一>

C/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数。
(1)  如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在stdlib.h, 其值为2147483647。
例如:

#include<stdio.h>
#include<stdlib.h>
void main()
{
       for(int i=0;i<10;i+)
             printf("%d/n",rand());
}

(2)  如果你要随机生成一个在一定范围的数,你可以在宏定义中定义一个random(int number)函数,然后在main()里面直接调用random()函数:

例如:随机生成10个0~100的数:
#include<stdio.h>
#include<stdlib.h>
#define random(x) (rand()%x)

void main()
{
     for(int x=0;x<10;x++)
           printf("%d/n",random(100));
}

 

(3)但是上面两个例子所生成的随机数都只能是一次性的,如果你第二次运行的时候输出结果仍和第一次一样。这与srand()函数有关。srand()用来设置rand()产生随机数时的随机数种子。在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子(seed), 如果未设随机数种子, rand()在调用时会自动设随机数种子为1。上面的两个例子就是因为没有设置随机数种子,每次随机数种子都自动设成相同值1 ,进而导致rand()所产生的随机数值都一样。

srand()函数定义 : void srand (unsigned int seed); 
通常可以利用geypid()或time(0)的返回值来当做seed
如果你用time(0)的话,要加入头文件#include<time.h>

例如:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define random(x) (rand()%x)

void main()
{

     srand((int)time(0));
     for(int x=0;x<10;x++)
           printf("%d/n",random(100));
}

这样两次运行的结果就会不一样了!!



linux g++“段错误 (核心已转储) ”一种可能原因及其解决方法


我在编写程序c++程序时定义几个很大的数组,都是约为1000*1000维,之所以定义的这么大是因为我想编写的程序要将一块空间划分为很细小的网格,我用这些大数组存储这些网格图心的坐标及该图心点的权值。比如:

  1. int row_n=(int)ceil(allnodes.squareL/gridlength);       

  2. int col_n=row_n;    

  3.   

  4. float centroid_x[row_n][col_n];   

  5. float centroid_y[row_n][col_n];  

   row_n值为1000;


   终端在运行的时候总是出现

“段错误 (核心已转储) ”

   

    在Eclipse中出现如下错误

Thread [1] 6201 [core: 1] (Suspended : Signal : SIGSEGV:Segmentation fault)  main() at 1028.cc:131 0x8049483

▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂   


      我的代码都是很简单的代码,也没用到指针什么的复杂的东西,怎么会出现这种问题呢?

   我们可以参看些关于段错误的知识:

   段错误主要原因是:

   1)访问系统数据区,尤其是往系统保护的内存地址写数据 ,最常见就是给一个指针以0地址 

   2)内存越界(数组越界,变量类型不一致等)

   3) 访问到不属于你的内存区域  

   那么看来我可能会出现数组越界的问题了!!

       那么在看些关于数组越界的背景吧(抱歉,小猴啥也不懂,找问题就得一点点点看,这里贴出自己是怎么找到问题所在的)

     http://blog.csdn.net/wind19/article/details/5964137

    看了帖子,对堆栈的概念加深了些了解,也有些启示,个人觉得我错误原因是这样的:

      栈空间用来存储数组等数据,那么段错误就应该是我存储的数组超过了它所在段的大小,于是在的程序执行的过程中一到跟大数组相关的步骤就会出现段错误的提示(SIGSEGV: Segmentation fault)。

     linux下应用  ulimit -a 命令查看当前栈空间大小,得到:

     8012   

     即我的系统下栈空间应该为8M,而可以自己算下自己定义的数组大小,发现我的数组每个大概3M多,而我的数组个数也大于3个,我的gdb中调试的过程中也恰巧是在第三个大维数数组那出现的问题,我的数组的确越过了stack段的边界,出现了错误。

▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂


     如何解决这个问题呢?

     我用

ulimit -s  102400

     将栈的大小改为100M(这回可够用了),然后运行程序或者debug,程序就能正确运行了。

    我在其他人的帖子里看见一些人说用vector容器可能会更好,自己还没有去深入学习,这是我下一步个工作吧,今天先把怎么解决这个问题的过程帖子这里。希望可以和大家交流下关于段错误的问题。

   解决问题中看到的一些觉得还不错的帖子:

   http://www.cs.ucsb.edu/~pconrad/cs16/10W/extraLabs/el01/  

   http://stackoverflow.com/questions/2346806/what-is-segmentation-fault

    http://www.linuxidc.com/Linux/2011-03/32874.htm

   

    

  

   

     



linux下ceil圆整函数的用法

在matlab中有向上圆整的函数ceil,同样在g++中也有ceil函数,通过man查询其在linux下的用法如下:

CEIL(3)                    Linux Programmer's Manual                   CEIL(3)


NAME

       ceil, ceilf, ceill - ceiling function: smallest integral value not less   than argument


SYNOPSIS

       #include <math.h>


       double ceil(double x);

       float ceilf(float x);

       long double ceill(long double x);


       Link with -lm.


举个例子吧:

#include <stdio.h>

int main()

{int x1;

float y1=5.4;

  x1=ceil(y1);

printf("x=%d",x1);


用法就是这么简单,大家可以实践下。


LINUX下C++函数用法大全【不断更新,欢迎补充】

小猴说:为了自己方便学习linux下的c++编程,也帮助自己区分开matlab和c++的一些不同点,我会在这个博客中不断更新我所碰到的一些c++函数,会尽量配着matlab对应于c++的函数来说。

一、A开头类

 

二、B开头类

三、C开头类

1、ceil圆整函数

Linux下C++语言与Win下的一点不同(关于INFINITY的定义)

我有一个判断点是否在多边形内部的的程序,在VS2012下编译通过了,运行正确,但是放到g++里就报错了,错误如下:

在一行里出现了这些错误,比如这个错误

invalid pure specifier (only ‘= 0’ is allowed) before ‘;’ token


找到源程序,怎么看也看部出来什么错误。




后来一看到说关于变量初始化啊,specifier方面有错误,想起来g++下无论是include的头文件啊还是一些其他的定义都有很多不同,通过man命令查看INFINITY发现是有定义的,不能再赋值了,只需要换一个变量名就可以解决这个问题了。g++下要注意的细节很多,大家编程时要仔细啊,把我的错误分享给大家了,希望对有类似问题的同学有帮助。





ubuntu12.04如何自动挂载文件夹和windows共享文件

Virtualbox虚拟机Ubuntu共享文件夹设置自动挂载



1. 安装增强功能包(Guest Additions)

安装好Ubuntu 后,运行Ubuntu并登录。然后在VirtualBox的菜单里选择"设备(D)" -> "安装增强功能(I)..."。  

您会发现在Ubuntu桌面上多出一个光盘图标,这张光盘默认被自动加载到了文档夹

/media/VBoxGuestAdditions-4.1.4

进入命令行终端,输入:

cd /media/VBoxGuestAdditions-4.1.4

sudo ./VboxLinuxAdditions.run

不同版本路径可能有所不同,请根据自己的实际情况安装

开始安装工具包,安装完毕后重启Ubuntu。

 


2. 配置共享文档夹

重启完成后点击"设备(Devices)" -> 共享文档夹(Shared Folders)菜单,添加一个共享文档夹,选项固定和临时是指该文档夹是否是持久的。共享名能够任取一个自己喜欢的,比如"gongxiang",尽量使用英文名称。



3. 挂载共享文档夹

重新进入虚拟Ubuntu,在命令行终端下输入:

sudo mkdir /mnt/shared    

sudo mount -t vboxsf gongxiang /mnt/shared

其中"gongxiang"是之前创建的共享文档夹的名字。OK,现在Ubuntu和主机能够互传文档了。

假如您不想每一次都手动挂载,能够在/etc/fstab中添加一项

gongxiang  /mnt/shared vboxsf rw,gid=username,uid=username,auto 0 0

以上的 vboxsf 是群组名称 username 是你的 用户名 就是 /home/下的文件夹名称

/mnt/shared 是挂载目录

这样就能够自动挂载了。

这里会需要用到vi编辑器对fstab文件进行编辑,小白们需要用这个略显麻烦的编辑器来编辑文档(我也是小白),找到文件所在目录,在命令行输入

sudo vi fstab

然后找到指定位置按大写I进入操作模式,其他命令你们自己查吧。对了,我的virtual box没有选择“自动加载”因为当时选了也不能自动加载,需要权限才能进入目录,后来看别人帖子说这个不用选了,要手动处理下才行。



如果不行的话就试试这个。


在文件 /etc/rc.local 中(用root用户)追加如下命令 mount -t vboxsf share /home/liuqin/mnt

OK,现在 Ubuntu 和主机可以互传 文件了。 


4. 卸载的话使用下面的命令: sudo umount -f /mnt/shared 注意: 共享文档夹的名称千万不要和挂载点的名称相同。