C和C随机数或字符串生成源码图文稿

合集下载

c语言随机生成乘法口诀

c语言随机生成乘法口诀

c语言随机生成乘法口诀下面是使用C语言随机生成乘法口诀的示例:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL)); // 初始化随机种子
int i, j;
int max_number = 9; // 表示乘法口诀表中最大的数,本例设置为9
for (i = 1; i <= max_number; i++) {
for (j = 1; j <= max_number; j++) {
int result = i * j;
// 生成随机颜色
int color = (rand() % 7) + 31;
// 在控制台打印乘法口诀表
printf("\033[%dm%d x %d = %2d ", color, i, j, result);
}
printf("\n");
}
return 0;
}
以上代码可以生成一个随机颜色的乘法口诀表,每行包含1到
9的乘法表达式。

通过调整max_number变量的值,可以控制生成乘法口诀的最大数。

颜色可以通过\033[数字m序列来设置,其中31表示红色,32表示绿色,以此类推。

c语言中有关随机函数的使用详解

c语言中有关随机函数的使用详解

c语言中有关随机函数的使用详解在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是voidsrand(inta)。

可能大家都知道C语言中的随机函数random,可是random函数并不是ANSIC标准,所以说,random函数不能在gcc,vc等编译器下编译通过。

rand()会返回一随机数值,范围在0至RAND_MAX间。

返回0至RAND_MAX之间的随机数值,RAND_MAX定义在stdlib.h,(其值至少为32767)我运算的结果是一个不定的数,要看你定义的变量类型,int整形的话就是32767。

在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。

一般用for语句来设置种子的个数。

具体见下面的例子。

一如何产生不可预见的随机序列呢利用srand((unsignedint)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。

在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。

它们就是rand()和srand()函数。

这二个函数的工作过程如下:1)首先给srand()提供一个种子,它是一个unsignedint类型,其取值范围从0~65535;2)然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)3)根据需要多次调用rand(),从而不间断地得到新的随机数;4)无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。

随机数生成原理 实现方法 不同编程语言的随机数函数

随机数生成原理 实现方法 不同编程语言的随机数函数

1-0:Microsoft VC++产生随机数的原理:Srand ( )和Rand( )函数。

它本质上是利用线性同余法,y=ax+b(mod m)。

其中a,b,m都是常数。

因此rand的产生决定于x,x被称为Seed。

Seed需要程序中设定,一般情况下取系统时间作为种子。

它产生的随机数之间的相关性很小,取值范围是0—32767(int),即双字节(16位数),若用unsigned int 双字节是65535,四字节是4294967295,一般可以满足要求。

1-1:线性同余法:其中M是模数,A是乘数,C是增量,为初始值,当C=0时,称此算法为乘同余法;若C ≠0,则称算法为混合同余法,当C取不为零的适当数值时,有一些优点,但优点并不突出,故常取C=0。

模M大小是发生器周期长短的主要标志,常见有M为素数,取A为M的原根,则周期T=M-1。

例如:a=1220703125a=32719 (程序中用此组数)a=16807代码:void main( ){const int n=100;double a=32719,m=1,f[n+1],g[n],seed;m=pow(2,31);cout<<"设置m值为"<<m-1<<endl;cout<<"输入种子"<<endl; //输入种子cin>>seed;f[0]=seed;for(int i=1;i<=n;i++) //线性同余法生成随机数{f[i]=fmod((a*f[i-1]),(m-1));g[i-1]=f[i]/(m-1);cout.setf(ios::fixed);cout.precision(6); //设置输出精度cout<<i<<" "<<'\t'<<g[i-1]<<endl;}}结果分析:统计数据的平均值为:0.485653统计数据的方差为:0.3205761-2:人字映射递推公式就是有名的混沌映射中的“人字映射”或称“帐篷映射”,它的非周期轨道点的分布密度函数:人字映射与线性同余法结合,可产生统计性质优良的均匀随机数。

C# Random随机函数使用方法

C# Random随机函数使用方法

C# Random随机函数使用方法随机数的使用很普遍,可用它随机显示图片,用它防止无聊的人在论坛灌水还可以用来加密信息等等。

本文讨论如何在一段数字区间内随机生成若干个互不相同的随机数,比如在从1到20间随机生成6个互不相同的整数,并通过此文介绍Visual c#中随机数的用法。

.net.Frameword中提供了一个专门产生随机数的类System.Random,此类默认情况下已被导入,编程过程中可以直接使用。

我们知道,计算机并不能产生完全随机的数字,它生成的数字被称为伪随机数,它是以相同的概率从一组有限的数字中选取的,所选的数字并不具有完全的随机性,但就实用而言,其随机程度已经足够了。

我们可以用以下两种方法初始化一个随机数发生器;函数是这样用,比如100至999的随机数Random ran=new Random();int RandKey=ran.Next(100,999);不过这样会有重复,可以给Random一个系统时间做为参数,以此产生随机数,就不会重复了第一种方法不指定随机种子,系统自动选取当前时前作随机种子:Random ra=new Random();第二种方法是指定一个int型的参数作为随机种子:int iSeed=6;Random ra=new Random(iSeed);下面我们要用到Random.Next()方法产生随机数。

ra.Next();它返回一个大于或等于零而小于2,147,483,647的数,这并不满足我们的需要,下面我们介绍它的重载函数和其它一些方法。

public virtual int Next(int);用法:ra.next(20)返回一个小于所指定最大值(此处为20)的正随机数。

public virtual int Next(int minValue, int maxValue);用法:ra.next(1,20)返回一个指定范围内(此处为1-20之间)的随机数,我们在下面的实例中会用到此函数。

C++真随机数生成方法

C++真随机数生成方法

C++真随机数⽣成⽅法引⾔⼤家都知道<stdlib.h>⾥⾯的rand和srand()函数吧?他们其实是伪随机数⽣成器,⽣成的随机数有周期性,⽽且取决于随机种⼦。

那么如何⽣成真随机数呢?下⾯我来讲⼀下两个系统下的⽣成⽅法。

正⽂Windows 系统代码这个WinRandom类调⽤了系统的加密秘钥⽣成器,这个⽣成器调⽤内核⽣成秘钥,所以是硬件的真随机数。

#include <windows.h>#include <wincrypt.h>class WinRandom {HCRYPTPROV handle;public:WinRandom() {handle = NULL;CryptAcquireContext((HCRYPTPROV*)&handle,NULL,NULL,PROV_RSA_FULL,0);}~WinRandom() {if (handle != NULL) CryptReleaseContext(handle, 0);}bool randBuf(void *dest, int len) {if (handle == NULL) return false;return CryptGenRandom(handle, len, (BYTE*)dest);}# define _(func, typ) \typ func() { \typ ret = 0; \assert(randBuf((void *)&ret, sizeof(ret))); \return ret; \}_(randInt, int)_(randLong, long long)_(randUnsigned, unsigned)_(randUnsignedLong, unsigned long long)_(randShort, short)_(randUnsignedShort, unsigned short)_(randChar, char)_(randUnsignedChar, unsigned char)_(randSignedChar, signed char)};使⽤姿势WinRandom R;printf("Unsigned: %u\nLong long: %lld\n",R.randUnsigned(),R.randLong());就是这样,还不⽤srand,是不是很⽅便啊?很适合做数据⽣成器!注意:请不要在⽐赛时使⽤!注意:请不要在⽐赛时使⽤!注意:请不要在⽐赛时使⽤!要在⽐赛时使⽤请看下⽅【通⽤】Linux 系统由于 Linux 系统⾃带了/dev/random,所以请使⽤ STL。

c++中随机生成一定范围数字的函数

c++中随机生成一定范围数字的函数

《C++中随机生成一定范围数字的函数》在C++编程中,随机生成一定范围的数字是一项常见且重要的任务。

在许多应用程序和游戏中,我们需要使用随机数来创建各种各样的场景和功能,例如生成随机地图、随机敌人出现、随机事件发生等等。

编写一个能够生成指定范围内随机数字的函数是非常有用的。

在本文中,我将探讨如何使用C++编程语言来实现一个可以随机生成一定范围数字的函数。

我将针对这个主题从简到繁地进行讨论,以帮助读者更深入地理解这一技术。

1. 使用rand函数生成随机数我们可以使用C++标准库中的rand()函数来生成随机数。

这个函数会返回一个介于0和RAND_MAX之间的整数值,但我们通常需要的是一个指定范围内的随机数。

我们需要将rand()生成的随机数映射到我们需要的范围内。

2. 使用取余操作和偏移来限定范围一种简单的方法是使用取余操作和偏移来将生成的随机数映射到指定范围内。

如果我们需要在1到100之间生成随机数,我们可以使用以下代码:```cppint randomNum = rand() % 100 + 1;这段代码将生成一个介于1和100之间的随机数,并且保持了均匀分布的特性。

3. 编写一个通用的函数为了使这个功能更加灵活和可重用,我们可以编写一个通用的函数来生成指定范围内的随机数。

这个函数应该接受最小值和最大值作为参数,并返回一个介于这两个值之间的随机数。

以下是一个简单的示例代码:```cppint randomInRange(int min, int max) {return rand() % (max - min + 1) + min;}```通过这个函数,我们可以在任何需要的地方轻松地生成指定范围内的随机数。

总结回顾通过本文的讨论,我们深入了解了在C++中实现随机生成一定范围数字的函数。

我们首先介绍了使用rand()函数生成随机数的基本方法,然后讨论了如何使用取余操作和偏移来限定范围,最后编写了一个通用的函数来实现这一功能。

c 随机函数

c 随机函数

c 随机函数一、前言C语言中的随机函数是我们经常用到的一个函数,它可以生成一个随机数,为我们的程序增加了一定的灵活性和随机性。

本文将详细介绍C语言中的随机函数。

二、什么是随机数随机数是指在一定范围内按照一定规律产生的数列中任意取出一个数。

在计算机领域中,随机数是由计算机程序根据某种算法生成的符合特定要求的数字序列。

三、C语言中的随机函数C语言中提供了rand()函数和srand()函数来生成伪随机数。

下面分别介绍这两个函数。

1. rand()函数rand()函数用于生成一个[0,RAND_MAX]之间的伪随机整数。

其中RAND_MAX是stdlib.h头文件中定义的常量,表示rand()能够返回的最大值。

2. srand() 函数srand() 函数用于初始化伪随机数发生器。

如果不调用srand() 函数,则每次调用 rand() 函数时都会得到同样的结果。

四、使用示例下面给出一个简单示例来演示如何使用rand()和srand() 函数:#include <stdio.h>#include <stdlib.h>#include <time.h>int main(){int i, j;srand((unsigned) time(NULL)); // 初始化种子for (i = 0; i < 10; i++) {j = rand();printf("%d\n", j);}return 0;}上述代码中,我们使用了time()函数来获取当前时间,然后将其作为srand()函数的参数来初始化随机数发生器。

接着使用for循环调用rand()函数生成10个随机数并输出。

五、如何提高随机性1. 改变种子如果每次生成伪随机数时都使用相同的种子,则每次生成的序列都是相同的。

因此,要想生成不同的序列,需要在每次程序运行时改变种子。

2. 使用更复杂的算法C语言中默认使用线性同余算法来产生伪随机数。

C++随机数(rand和srand)函数用法详解

C++随机数(rand和srand)函数用法详解

C++随机数(rand和srand)函数⽤法详解c++随机数C++ 提供了⼀组函数以⽣成和使⽤随机数字。

随机数字就是从⼀组可能的值中进⾏随机选择⽽获得的⼀个值。

该组中的值都有相同的被选中的⼏率。

C++ 库有⼀个名为 rand() 的函数,每次调⽤该函数都将返回⼀个⾮负整数。

要使⽤ rand() 函数,必须在程序中包含 cstdlib 头⽂件。

以下是其⽤法⽰例:randomNum = rand();但是,该函数返回的数字其实是伪随机数。

这意味着它们具有随机数的表现和属性,但实际上并不是随机的,它们实际上是⽤算法⽣成的。

该算法需要⼀个起始值,称为种⼦,以⽣成数字。

如果没有给出⼀个种⼦,那么它将在每次运⾏时产⽣相同的数字流。

下⾯的程序说明了这⼀点://This program demonstrates what happens in C++ if you// try to generate random numbers without setting a "seed".#include <iostream>#include <cstdlib>// Header file needed to use randusing namespace std;int main(){// Generate and printthree random numberscout << rand() << " ";cout << rand() << " ";cout << rand() << endl ;return 0;}第1次运⾏输出结果:41 18467 6334第2次运⾏输出结果:41 18467 6334要在每次运⾏程序时获得不同的随机数字流,则必须为随机数⽣成器提供⼀个种⼦以开始。

C语言生成随机数代码

C语言生成随机数代码

C语⾔⽣成随机数代码
1 #include <stdio.h>
3 #include <stdlib.h>
5 #include <time.h>
7int main() {
9int a;
11 srand((unsigned)time(NULL)); //读取系统时间,产⽣⼀个种⼦数值
13 a = rand();
15 printf("%d\n", a); //可扩展为验证码代码
17return0;
19 }
⽣成⼀定范围内的随机数
在实际开发中,我们往往需要⼀定范围内的随机数,过⼤或者过⼩都不符合要求,那么,如何产⽣⼀定范围的随机数呢?我们可以利⽤取模的⽅法:
int a = rand() % 10; //产⽣0~9的随机数,注意10会被整除
如果要规定上下限:
int a = rand() % 51 + 13; //产⽣13~63的随机数
分析:取模即取余,rand()%51+13我们可以看成两部分:rand()%51是产⽣ 0~50 的随机数,后⾯+13保证 a 最⼩只能是 13,最⼤就是
50+13=63。

代码⽰例:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int a;
srand((unsigned)time(NULL));
a = rand() % 51 + 13;
printf("%d\n",a);
return0;
}。

用C语言产生随机数

用C语言产生随机数

用c语言产生随机数在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a)。

可能大家都知道C语言中的随机函数random,可是random函数并不是ANSI C标准,所以说,random函数不能在gcc,vc等编译器下编译通过。

rand()会返回一随机数值,范围在0至RAND_MAX 间。

返回0至RAND_MAX之间的随机数值,RAND_MAX定义在,(其值至少为32767),运算的结果是一个不定的数,要看你定义的变量类型,int整形的话就是32767。

在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。

一般用for语句来设置种子的个数。

具体见下面的例子。

一如何产生不可预见的随机序列呢利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。

在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。

它们就是rand()和srand()函数。

这二个函数的工作过程如下:1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)3) 根据需要多次调用rand(),从而不间断地得到新的随机数;4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。

抽签小程序(C语言随机数)

抽签小程序(C语言随机数)

抽签⼩程序(C语⾔随机数)最近班级⾥需要⼈员抽签参加活动,闲来⽆事⽤java的(Math.random()⽅法||java.util.Random())写了⼀个随机抽签的,所以我⼜了解了⼀下C语⾔的随机数获取。

C语⾔的随机数获取:参考:程序的抽签信息源⽂件可以⾃⼰通过程序去做出来。

咳咳,虽然⽅法很笨…程序中有些函数注释掉了,还有的隐藏了,就是制作源信息⽂件的。

你们可以改进改进,我这个写的⽐较乱。

还有就是因为我不太喜欢参加活动,所以在随机数函数⾥是输出不出来46号的。

具体程序代码:#include<stdio.h>#include<time.h>#include<stdlib.h>#include<windows.h>#include<string.h>#define COUNT 48 //总⼈数//#define STU 20 //抽取学⽣⼈数 -为⽤户⾃定义⼈数,所以不启⽤//#define INITCOUNT 100 顺序表初始化量//#define INCREMENT 10 顺序表增量typedef struct{char no[15];//学号char name[10];//姓名}student;//-----------------------------------FILE *stu,*lu;//定义学⽣信息源⽂件指针,幸运⼉⽂件指针char *pno="学号",*pname="姓名",*pflag="编号";//字符串指针int n;//抽取幸运⼉数量//-----------------------------------/*typedef struct{student *data;//基地址int length;//长度}StuList; 顺序表-暂不启⽤*///----函数声明---void MENU();//菜单unsigned int RandomNum();//随机数,Seed为time,单位为秒void DivCount(int *n);//⽤户⾃定义抽取⼈数void TestInput(student *p);//测试输⼊int WriteLuckyVisible(student *p,int *Lucky);//写⼊幸运⼉txt⽂件,⽤户可视化的int ReadStu(student *p); //读取信息源⽂件int WriteStuInvisible(student *p);//制作信息源⽂件时使⽤int ReadStuVisible(student *p);//制作读取数据源信息时使⽤//--------------void main(){//-----变量定义----------int choose,i,j;int Lucky[COUNT];//幸运⼉student data[COUNT];//----------------------DivCount(&n);//ReadStuVisible(data);制作完毕-暂不启⽤ReadStu(data);for(;;){MENU();scanf("%d",&choose);switch(choose){case 1:do{printf("--抽取中--\n");printf("计数⼁%s⼁%s\t %s\n",pflag,pno,pname);for(i=0;i<n;i++){Lucky[i]=RandomNum();for(j=0;j<i;j++)//---寻找重复项{if(Lucky[j]==Lucky[i])while(Lucky[i]==Lucky[j]){Lucky[i]=RandomNum();}elsecontinue;}//printf("%d\n",Lucky[i]);随机数重复测试printf("第%-3d. %-4d% -13s %-5s\n",i+1,Lucky[i],data[Lucky[i]-1].no,data[Lucky[i]-1].name);//下标从0开始 }//------------------------------printf("【1.重新抽取⼁2.输出⾄TXT⽂件⼁】:");scanf("%d",&choose);switch(choose){case 1:;break;case 2:if((WriteLuckyVisible(data,Lucky)==1))printf("输出成功!\n");elseprintf("错误!\n");;break;default:printf("输⼊错误!\n");}}while(choose==1);;break;case 2:exit(0);break;case 8:printf("%s\t%s",data[0].no,data[0].name);break;case 9://TestInput(data);WriteStuInvisible(data);break;default:printf("\t\t\t\t\t输⼊错误!");break;}system("pause");}}int ReadStuVisible(student *p){int i;if((stu=fopen("002.txt","r"))==NULL)return 0;for(i=0;i<COUNT;i++)fscanf(stu,"%s %s",(p+i)->name,(p+i)->no);fclose(stu);return 1;}int ReadStu(student *p){if((stu=fopen("Source.data","r"))==NULL)return 0;fread(p,sizeof(student),COUNT,stu);fclose(stu);return 1;}int WriteStuInvisible(student *p){if((stu=fopen("Source.data","wt+"))==NULL)return 0;fwrite(p,sizeof(student),COUNT,stu);fclose(stu);return 1;}int WriteLuckyVisible(student *p,int *Lucky){int i;if((lu=fopen("LuckyDog.txt","wt+"))==NULL)return 0;fprintf(lu,"计数⼁%s⼁%s\t %s\n",pflag,pno,pname);for(i=0;i<n;i++){fprintf(lu,"第%-4d. %-4d% -13s %-5s\n",i+1,Lucky[i],p[Lucky[i]-1].no,p[Lucky[i]-1].name);}fclose(lu);return 1;}void TestInput(student *p){int i;for(i=0;i<COUNT;i++){system("cls");printf("----No.%d----\n",i+1);printf("学号:");scanf("%s",(p+i)->no);printf("姓名;");scanf("%s",(p+i)->name);}}void DivCount(int *n){for(;;){system("cls");printf("\t\t\t\t请输⼊本次准备抽取⼈数:");scanf("%d",n);if(*n<1||*n>COUNT){printf("\t\t\t\t抽取⼈数不合法!");system("pause");continue;}elsebreak;}}unsigned int RandomNum(){unsigned int x;srand(time(NULL));for(;;){Sleep(1000);x=rand()%COUNT+1;if(x!=46)break;elsecontinue;}return x;}void MENU(){system("cls");printf("\t\t\t\t --------------------\n");printf("\t\t\t\t⼁ 1.抽取 2.结束⼁\n");printf("\t\t\t\t --------------------\n");printf("\t\t\t\t 请输⼊:");}呃呃,⾃⼰预想的好多功能还没有实现,⽽且抽签的实现⽅法还有点复杂。

C#100例经典源代码

C#100例经典源代码

C#语言100例经典源代码程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。

组成所有的排列后再去掉不满足条件的排列。

2.程序源代码:main(){int i,j,k;printf("\n");for(i=1;i<5;i++) /*以下为三重循环*/for(j=1;j<5;j++)for (k=1;k<5;k++){if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/printf("%d,%d,%d\n",i,j,k);}}==============================================================【程序2】题目:企业发放的奖金根据利润提成。

利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。

注意定义时需把奖金定义成长整型。

2.程序源代码:main(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;else if(i<=200000)bonus=bonus1+(i-100000)*0.075;else if(i<=400000)bonus=bonus2+(i-200000)*0.05;else if(i<=600000)bonus=bonus4+(i-400000)*0.03;else if(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus);}==============================================================【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。

JAVA字符串格式化-String.format()的使用【生成随机数补0操作】

JAVA字符串格式化-String.format()的使用【生成随机数补0操作】

JAVA字符串格式化-String.format()的使⽤【⽣成随机数补0操作】转:常规类型的格式化String类的format()⽅法⽤于创建格式化的字符串以及连接多个字符串对象。

熟悉C语⾔的同学应该记得C语⾔的sprintf()⽅法,两者有类似之处。

format()⽅法有两种重载形式。

format(String format, Object... args) 新字符串使⽤本地语⾔环境,制定字符串格式和参数⽣成格式化的新字符串。

format(Locale locale, String format, Object... args) 使⽤指定的语⾔环境,制定字符串格式和参数⽣成格式化的字符串。

显⽰不同转换符实现不同数据类型到字符串的转换,如图所⽰转换符说明⽰例%s字符串类型"mingrisoft"%c字符类型'm'%b布尔类型true%d整数类型(⼗进制)99%x整数类型(⼗六进制)FF%o整数类型(⼋进制)77%f浮点类型99.99%a⼗六进制浮点类型FF.35AE%e指数类型9.38e+5%g通⽤浮点类型(f和e类型中较短的)%h散列码%%百分⽐类型%%n换⾏符%tx⽇期与时间类型(x代表不同的⽇期与时间转换符public static void main(String[] args) {String str=null;str=String.format("Hi,%s", "王⼒");System.out.println(str);str=String.format("Hi,%s:%s.%s", "王南","王⼒","王张");System.out.println(str);System.out.printf("字母a的⼤写是:%c %n", 'A');System.out.printf("3>7的结果是:%b %n", 3>7);System.out.printf("100的⼀半是:%d %n", 100/2);System.out.printf("100的16进制数是:%x %n", 100);System.out.printf("100的8进制数是:%o %n", 100);System.out.printf("50元的书打8.5折扣是:%f 元%n", 50*0.85);System.out.printf("上⾯价格的16进制数是:%a %n", 50*0.85);System.out.printf("上⾯价格的指数表⽰:%e %n", 50*0.85);System.out.printf("上⾯价格的指数和浮点数结果的长度较短的是:%g %n", 50*0.85);System.out.printf("上⾯的折扣是%d%% %n", 85);System.out.printf("字母A的散列码是:%h %n", 'A');}输出结果:Hi,王⼒Hi,王南:王⼒.王张字母a的⼤写是:A3>7的结果是:false100的⼀半是:50100的16进制数是:64100的8进制数是:14450元的书打8.5折扣是:42.500000元上⾯价格的16进制数是:0x1.54p5上⾯价格的指数表⽰:4.250000e+01上⾯价格的指数和浮点数结果的长度较短的是:42.5000上⾯的折扣是85%字母A的散列码是:41搭配转换符的标志如图所⽰:标志说明⽰例结果+为正数或者负数添加符号("%+d",15)+15−左对齐("%-5d",15)|15 |0数字前⾯补0("%04d", 99)0099空格在整数之前添加指定数量的空格("% 4d", 99)| 99|,以“,”对数字分组("%,f", 9999.99)9,999.990000 (使⽤括号包含负数("%(f", -99.99)(99.990000)#如果是浮点数则包含⼩数点,如果是16进制或8进制则添加0x或0("%#x", 99)("%#o", 99)0x630143< 格式化前⼀个转换符所描述的参数("%f和%<3.2f",99.45)99.450000和99.45$被格式化的参数索引("%1$d,%2$s", 99,"abc")99,abcpublic static void main(String[] args) {String str=null;//$使⽤str=String.format("格式参数$的使⽤:%1$d,%2$s", 99,"abc");System.out.println(str);//+使⽤System.out.printf("显⽰正负数的符号:%+d与%d%n", 99,-99);//补O使⽤System.out.printf("最⽜的编号是:%03d%n", 7);//空格使⽤System.out.printf("Tab键的效果是:% 8d%n", 7);//.使⽤System.out.printf("整数分组的效果是:%,d%n", 9989997);//空格和⼩数点后⾯个数System.out.printf("⼀本书的价格是:% 50.5f元%n", 49.8);}输出结果格式参数$的使⽤:99,abc显⽰正负数的符号:+99与-99最⽜的编号是:007Tab键的效果是:7整数分组的效果是:9,989,997⼀本书的价格是:49.80000元⽇期和事件字符串格式化在程序界⾯中经常需要显⽰时间和⽇期,但是其显⽰的格式经常不尽⼈意,需要编写⼤量的代码经过各种算法才得到理想的⽇期与时间格式。

c#Random快速连续产生相同随机数的解决方案

c#Random快速连续产生相同随机数的解决方案

c#Random快速连续产⽣相同随机数的解决⽅案代码如下:复制代码代码如下:namespace RandomTest{class Program{static void Main(string[] args){for (int i = 0; i < 100; i++){Random d = new Random();Console.WriteLine(d.Next(100));}}}}理论上⽽⾔,这个程序会产⽣100个不同的0~100的整数,⽽实际情况却是除了第⼀个数字不同外,剩余99个数字会产⽣随机的99个相同的数字!⽽在中间加⼊调试点或者⽤MessageBox.show()的⽅式却能正确的得到100个不同的随机数!为什么这样?难道要暂停⼀下⼦?于是修改代码:复制代码代码如下:namespace RandomTest{class Program{static void Main(string[] args){for (int i = 0; i < 100; i++){Random d = new Random();Thread.Sleep(15);Console.WriteLine(d.Next(100));}}}}再次运⾏后,输出的数字终于随机了,⽽且15毫秒以上的暂停才会正常,如果只暂停1毫秒的话,会规律地出现连续5-6个⼀样的随机数,如果改成5毫秒的暂停的话,这种重复产⽣⼀样随机数的概率变成2-3个!在⽹上苦苦搜索了2天,没什么帮助,⽽在CSDN论坛却很快有⼈给了解决⽅法:复制代码代码如下:namespace RandomTest{class Program{static void Main(string[] args){Random d = new Random();for (int i = 0; i < 100; i++){Console.WriteLine(d.Next(100));}}}}把随机对象放在循环的外⾯就能解决问题!但还是没⼈能给个解释。

C#生成随机姓名,随机汉字的产生

C#生成随机姓名,随机汉字的产生

C#⽣成随机姓名,随机汉字的产⽣public static object[] CreateRegionCode(int strlength, bool isRandomCount = false){if (isRandomCount){Random random = new Random();strlength = random.Next(1, strlength + 1);}//定义⼀个字符串数组储存汉字编码的组成元素string[] rBase = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };Random rnd = new Random();//定义⼀个object数组⽤来object[] bytes = new object[strlength];/*每循环⼀次产⽣⼀个含两个元素的⼗六进制字节数组,并将其放⼊bject数组中每个汉字有四个区位码组成区位码第1位和区位码第2位作为字节数组第⼀个元素区位码第3位和区位码第4位作为字节数组第⼆个元素*/for (int i = 0; i < strlength; i++){//区位码第1位int r1 = rnd.Next(11, 14);string str_r1 = rBase[r1].Trim();//区位码第2位rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);//更换随机数发⽣器的种⼦避免产⽣重复值int r2;if (r1 == 13){r2 = rnd.Next(0, 7);}else{r2 = rnd.Next(0, 16);}string str_r2 = rBase[r2].Trim();//区位码第3位rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);int r3 = rnd.Next(10, 16);string str_r3 = rBase[r3].Trim();//区位码第4位rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);int r4;if (r3 == 10){r4 = rnd.Next(1, 16);}else if (r3 == 15){r4 = rnd.Next(0, 15);}else{r4 = rnd.Next(0, 16);}string str_r4 = rBase[r4].Trim();//定义两个字节变量存储产⽣的随机汉字区位码byte byte1 = Convert.ToByte(str_r1 + str_r2, 16);byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);//将两个字节变量存储在字节数组中byte[] str_r = new byte[] { byte1, byte2 };//将产⽣的⼀个汉字的字节数组放⼊object数组中bytes.SetValue(str_r, i);}return bytes;}姓⽒获取public static string GetSurname(){Random random = new Random();int index = random.Next(0, surname.Count());return surname[index];}public static List<string> surname = new List<string>() {"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "楮", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "⾦", "魏", "陶", "姜","戚", "谢", "邹", "喻", "柏", "⽔", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎","鲁", "韦", "昌", "马", "苗", "凤", "花", "⽅", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐","费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常","乐", "于", "时", "傅", "⽪", "卞", "齐", "康", "伍", "余", "元", "⼘", "顾", "孟", "平", "黄", "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "⽑", "禹", "狄", "⽶", "贝", "明", "臧", "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "梁", "杜", "阮", "蓝", "闽", "席", "季", "⿇", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭", "梅", "盛", "林", "刁", "锺", "徐", "丘", "骆", "⾼", "夏", "蔡", "⽥", "樊", "胡", "凌", "霍", "虞", "万", "⽀", "柯", "昝", "管", "卢", "莫", "经", "房", "裘", "缪", "⼲", "解", "应", "宗", "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪", "包", "诸", "左", "⽯", "崔", "吉", "钮", "龚", "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀", "⽺", "於", "惠", "甄", "麹", "家", "封", "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "⼸", "牧", "隗", "⼭", "⾕", "车", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫", "宁", "仇", "栾", "暴", "⽢", "斜", "厉", "戎", "祖", "武", "符", "刘", "景", "詹", "束", "龙", "叶", "幸", "司", "韶", "郜", "黎", "蓟", "薄", "印", "宿", "⽩", "怀", "蒲", "邰", "从", "鄂", "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阴", "郁", "胥", "能", "苍", "双", "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍", "郤", "璩", "桑", "桂", "濮", "⽜", "寿", "通", "边", "扈", "燕", "冀", "郏", "浦", "尚", "农", "温", "别", "庄", "晏", "柴", "瞿", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼", "容", "向", "古", "易", "慎", "⼽", "廖", "庾", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘", "匡", "国", "⽂", "寇", "⼴", "禄", "阙", "东", "欧", "⽎", "沃", "利", "蔚", "越", "夔", "隆", "师", "巩", "厍", "聂", "晁", "勾", "敖", "融", "冷", "訾", "⾟", "阚", "那", "简", "饶", "空", "曾", "⽏", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红", "游", "竺", "权", "逑", "盖", "益", "桓", "公", "仉", "督", "晋", "楚", "阎", "法", "汝", "鄢", "涂", "钦", "岳", "帅", "缑", "亢", "况", "后", "有", "琴", "归", "海", "墨", "哈", "谯", "笪", "年", "爱", "阳", "佟", "商", "牟", "佘", "佴", "伯", "赏","万俟", "司马", "上官", "欧阳", "夏侯", "诸葛", "闻⼈", "东⽅", "赫连", "皇甫", "尉迟", "公⽺", "澹台", "公冶", "宗政", "濮阳", "淳于", "单于", "太叔", "申屠", "公孙", "仲孙", "轩辕", "令狐", "锺离", "宇⽂", "长孙", "慕容", "鲜于", "闾丘", "司徒", "司空", "丌官", "司寇", "⼦车", "微⽣", "颛孙", "端⽊", "巫马", "公西", "漆雕", "乐正", "壤驷", "公良", "拓拔", "夹⾕", "宰⽗", "⾕梁", "段⼲", "百⾥", "东郭", "南门", "呼延", "⽺⾆", "梁丘", "左丘", "东门", "西门", "南宫"};//使⽤for (int j = 0; j < 20; j++){//姓string surname = ChineseName.GetSurname();//获取GB2312编码页(表)Encoding gb = Encoding.GetEncoding("gb2312");//调⽤函数产⽣4个随机中⽂汉字编码object[] bytes = ChineseName.CreateRegionCode(2, true);//根据汉字编码的字节数组解码出中⽂汉字string name = string.Empty;for (int i = 0; i < bytes.Length; i++){name += gb.GetString((byte[])Convert.ChangeType(bytes[i], typeof(byte[])));}Console.WriteLine($"{surname} {name}");Thread.Sleep(100);}。

C#随机数——精选推荐

C#随机数——精选推荐

C#随机数 随机数的类为Random,命名空间为System。

转到Random的定义可以看到如下代码(我把注释删掉了):namespace System{public class Random{public Random();public Random(int Seed);public virtual int Next();public virtual int Next(int minValue, int maxValue);public virtual int Next(int maxValue);public virtual void NextBytes(byte[] buffer);public virtual double NextDouble();protected virtual double Sample();}} 我们从易到难挨个说说。

Random(); 这是⽆参构造⽅法,⽐如在程序中这样写:Random a = new Random(); 得到的a就是⼀个随机数⽣成器,它可以⽤来⽣成随机数。

int Next(); 这个⽅法返回值为int类型,调⽤它就能得到⼀个随机数,反复调⽤就能反复得到随机数。

例:static void Main(string[] args){Random a = new Random();for (int i = 0; i < 10; i++){Console.WriteLine(a.Next());}Console.ReadKey();} 这样就得到了10个随机数,运⾏结果如下: 需要注意的是,虽然看上去Next⽅法返回值是int类型,但实际上它只返回⾮负整数,⽽且不包括int类型能表⽰的最⼤的那个整数(2^31 - 1)int Next(int minValue, int maxValue); 这个⽅法能指定随机数的⽣成范围,左闭右开区间,即⽣成的数能包含minValue,不包含maxValue。

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

C和C随机数或字符串生成源码文件管理序列号:[K8UY-K9IO69-O6M243-OL889-F88688]1. 基本函数在C语言中取随机数所需要的函数是:rand()函数和srand()函数被声明在头文件stdlib.h中,所以要使用这两个函数必须包含该头文件:2. 使用方法rand()函数返回0到RAND_MAX之间的伪随机数(pseudorandom)。

RAND_MAX常量被定义在stdlib.h头文件中。

其值等于32767,或者更大。

srand()函数使用自变量n作为种子,用来初始化随机数产生器。

只要把相同的种子传入srand(),然后调用rand()时,就会产生相同的随机数序列。

因此,我们可以把时间作为srand()函数的种子,就可以避免重复的发生。

如果,调用rand()之前没有先调用srand(),就和事先调用srand(1)所产生的结果一样。

每次运行都将输出:1 7 4 0 9 4 8 8 2 4每次运行都将输出:1 7 4 0 9 4 8 8 2 4例2的输出结果与例1是完全一样的。

每次运行都将输出:4 0 1 3 5 3 7 7 1 5该程序取得的随机值也是在[0,10)之间,与srand(1)所取得的值不同,但是每次运行程序的结果都相同。

该程序每次运行结果都不一样,因为每次启动程序的时间都不同。

另外需要注意的是,使用time()函数前必须包含头文件time.h。

3. 注意事项求一定范围内的随机数。

如要取[0,10)之间的随机整数,需将rand()的返回值与10求模。

randnumber =rand()% 10;那么,如果取的值不是从0开始呢你只需要记住一个通用的公式。

要取[a,b)之间的随机整数(包括a,但不包括b),使用:(rand() % (b - a)) + a伪随机浮点数。

要取得0~1之间的浮点数,可以用:rand() / (double)(RAND_MAX)如果想取更大范围的随机浮点数,比如0~100,可以采用如下方法: rand() /((double)(RAND_MAX)/100)其他情况,以此类推,这里不作详细说明。

当然,本文取伪随机浮点数的方法只是用来说明函数的使用办法,你可以采用更好的方法来实现。

举个例子,假设我们要取得0~10之间的随机整数(不含10本身):大家可能很多次讨论过随机数在计算机中怎样产生的问题,在这篇文章中,我会对这个问题进行更深入的探讨,阐述我对这个问题的理解。

首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。

其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。

计算机只能生成相对的随机数,即伪随机数。

伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。

怎样理解呢产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。

比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。

从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。

那么计算机中随机数是怎样产生的呢有人可能会说,随机数是由“随机种子”产生的。

没错,随机种子是用来产生随机数的一个数,在计算机中,这样的一个“随机种子”是一个无符号整形数。

那么随机种子是从哪里获得的呢下面看这样一个C程序:static unsigned int RAND_SEED;unsigned int random(void){RAND_SEED=(RAND_SEED*123+59)%65536;return(RAND_SEED);}void random_start(void){int temp[2];movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4); RAND_SEED=temp[0];}main(){unsigned int i,n;random_start();for(i=0;i<10;i++)printf("%u\t",random());printf("\n");这个程序(rand01.c)完整地阐述了随机数产生的过程:首先,主程序调用random_start()方法,random_start()方法中的这一句我很感兴趣:movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);这个函数用来移动内存数据,其中FP_SEG(far pointer to segment)是取temp数组段地址的函数,FP_OFF(far pointer to offset)是取temp数组相对地址的函数,movedata函数的作用是把位于0040:006CH 存储单元中的双字放到数组temp的声明的两个存储单元中。

这样可以通过temp数组把0040:006CH处的一个16位的数送给RAND_SEED。

random用来根据随机种子RAND_SEED的值计算得出随机数,其中这一句:RAND_SEED = (RAND_SEED*123+59)%65536;是用来计算随机数的方法,随机数的计算方法在不同的计算机中是不同的,即使在相同的计算机中安装的不同的操作系统中也是不同的。

我在linux和windows下分别试过,相同的随机种子在这两种操作系统中生成的随机数是不同的,这说明它们的计算方法不同。

现在,我们明白随机种子是从哪儿获得的,而且知道随机数是怎样通过随机种子计算出来的了。

那么,随机种子为什么要在内存的0040:006CH 处取0040:006CH处存放的是什么学过《计算机组成原理与接口技术》这门课的人可能会记得在编制ROM BIOS时钟中断服务程序时会用到Intel 8253定时/计数器,它与Intel8259中断芯片的通信使得中断服务程序得以运转,主板每秒产生的18.2次中断正是处理器根据定时/记数器值控制中断芯片产生的。

在我们计算机的主机板上都会有这样一个定时/记数器用来计算当前系统时间,每过一个时钟信号周期都会使记数器加一,而这个记数器的值存放在哪儿呢没错,就在内存的0040:006CH处,其实这一段内存空间是这样定义的: TIMER_LOW DW ;地址为 0040:006CH TIMER_HIGH DW ;地址为0040:006EHTIMER_OFT DB ;地址为 0040:0070H时钟中断服务程序中,每当TIMER_LOW转满时,此时,记数器也会转满,记数器的值归零,即TIMER_LOW处的16位二进制归零,而TIMER_HIGH加一。

rand01.c中的movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);正是把TIMER_LOW和TIMER_HIGH两个16位二进制数放进temp数组,再送往RAND_SEED,从而获得了“随机种子”。

现在,可以确定的一点是,随机种子来自系统时钟,确切地说,是来自计算机主板上的定时/计数器在内存中的记数值。

这样,我们总结一下前面的分析,并讨论一下这些结论在程序中的应用:1.随机数是由随机种子根据一定的计算方法计算出来的数值。

所以,只要计算方法一定,随机种子一定,那么产生的随机数就不会变。

看下面这个C++程序:在相同的平台环境下,编译生成exe后,每次运行它,显示的随机数都是一样的。

这是因为在相同的编译平台环境下,由随机种子生成随机数的计算方法都是一样的,再加上随机种子一样,所以产生的随机数就是一样的。

2.只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟(即定时/计数器的值)看下面这个C++程序:这里用户和其他程序没有设定随机种子,则使用系统定时/计数器的值做为随机种子,所以,在相同的平台环境下,编译生成exe后,每次运行它,显示的随机数会是伪随机数,即每次运行显示的结果会有不同。

3.建议:如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子。

for(int i = 0; i < m; i++){//大家看到了,随机种子会随着for循环在程序中设置多次srand((unsigned)time(NULL)*j);//j是后加的外层循环rNum = 1+(int)((rand()/(double)RAND_MAX)*36);//求随机值switch(rNum){case 1: ch[i]='a';break;case 2: ch[i]='b';break;case 3: ch[i]='c';break;case 4: ch[i]='d';break;case 5: ch[i]='e';break;case 6: ch[i]='f';break;case 7: ch[i]='g';break;case 8: ch[i]='h';break;case 9: ch[i]='i'; break;case 10: ch[i]='j'; break;case 11: ch[i]='k'; break;case 12: ch[i]='l'; break;case 13: ch[i]='m'; break;case 14: ch[i]='n'; break;case 15: ch[i]='o'; break;case 16: ch[i]='p'; break;case 17: ch[i]='q'; break;case 18: ch[i]='r'; break;case 19: ch[i]='s'; break;case 20: ch[i]='t'; break;case 21: ch[i]='u'; break;case 22: ch[i]='v'; break;case 23: ch[i]='w'; break;case 24: ch[i]='x'; break;case 25: ch[i]='y'; break;case 26: ch[i]='z'; break;case 27:ch[i]='0'; break;case 28:ch[i]='1'; break;case 29:ch[i]='2'; break;case 30:ch[i]='3'; break;case 31:ch[i]='4';break;case 32:ch[i]='5';break;case 33:ch[i]='6';break;case 34:ch[i]='7';break;case 35:ch[i]='8';break;case 36:ch[i]='9';break;}//end of switchcout<< ch[i];}//end of for loopcout<<endl;delete []ch;return 0;}而运行结果显示的随机字符串的每一个字符都是一样的,也就是说生成的字符序列不随机,所以我们需要把srand((unsigned)time(NULL)); 从for循环中移出放在for语句前面,这样可以生成随机的字符序列,而且每次运行生成的字符序列会不同(呵呵,也有可能相同,不过出现这种情况的几率太小了)。

相关文档
最新文档