C\C++ 生成各位数不相等的随机数

  最近想写一个1A2B的小游戏来练习一下,结果在第一步生成随机数的时候就遇到了一点点问题。

  游戏初始化时需要先生成一个四位随机数,且各位各不相等。于是最开始的思路是生成一个整数数组,只需要判断生成的随机数字是否跟之前的数字有重复,有则重新生成即可,但是之后发现两个问题。首先是,函数每次调用后生成的随机数是一样的。第二,生成的随机数如果0在第一位,则调用itoa函数时会被舍弃掉。

  后来研究中发现,出现的原因是srand放在了函数里,每次调用函数都就重置随机数种子至初始值,于是就会出现生成的随机数都一样的情况。至于第二种错误,可以通过另一种方式来巧妙避免。代码如下,代码中的思路为:

  先生成一个0-9的整数数组,再随机从中取一个数,只要不等于-1就将其取出放置到要生成的随机数中,并将该位置为-1。这样做也能提高一点点效率,而不用去删除数组成员。

 1 /******************************************************************************
 2 *函数名称:void GetRandom(char * random)
 3 *函数功能:产生一个各位数不相等的四位随机数
 4 *入口参数:random为返回的随机数
 5 *返 回 值:无
 6 *备 注:先生成一个0-9的整数数组,再随机从中取四个数,每取一个将该位置为-1
 7 *******************************************************************************/
 8 void GetRandom(char * random){
 9     int i, j[10], k;
10     for (i = 0; i < 10; i++){
11         j[i] = i;
12     }
13     for(i = 0; i < 4; i++){
14         //生成第i个随机数
15         k = (int)rand() % 10;//k为下标
16         while (j[k] == -1){
17             k = (k + 1) % 10;
18         }
19         random[i] = ‘0‘ + j[k];
20         j[k] = -1;
21     }
22 }

时间: 2024-09-29 03:32:27

C\C++ 生成各位数不相等的随机数的相关文章

python随机生成6位数验证码

#随机生成6位数验证码 import randomcode = []for i in range(6):    if i == str(random.randint(1,5)):        code.append(i)    else:       temp =  random.randint(65,90)       code.append(chr(temp)) print ''.join(code) ###扩充random用法,随机生成树,和程序无关 print random.rando

php 生成8位数唯一的激活码

/** *生成激活码 * */ function showGenerationActivationCode(){ #渠道类型id $channel_id=$_POST['channel']; #根据渠道id去查询渠道英文名称 $channelInfo = load_mysql ( "channelInfo" ); $_res=$channelInfo->getInfoById($channel_id); $en_name=$_res['en_name']; #活动类型 $type

为产品或者商品随机生成6位数的数字编码方案

--为产品或者商品随机生成6位数的数字编码方案 --准备阶段 --建立一个表,生成100000到999999顺序编码 create table #no (  id int ) declare @id int  set @id=1 while(@id<=999999) begin  insert into #no values(@id)  set @[email protected]+1 end --建立随机编码表 create table RNo (  id int identity(1,1),

PHP CodeBase: 生成N个不重复的随机数

有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次.前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空.那么你会如何填补这个漏子? 当然向上级反映情况.但是我们这里讨论的是技术,就是需要生成1-25之间的16个不重复的随机数,去填补.具体怎么设计函数呢?将随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数. 程序如下: <?php/** array unique_rand( int $min, int $max, int $num

使用C++生成1-33中的6个随机数,无重复

生成1-33中的6个随机数,无重复 ------------------------------------------------------------------------ 方法1.每生成一个随机数,便于前面的所有随机数进行比较,如果有重复,则舍去不要,重新选取. 但该方法十分费时,并且在数据量巨大的并且有一定限制的时候,会引发巨大问题. 例如要生成10000个随机数,范围是0-9999,且不能重复,那么最后几个随机数有可能需要相当长的时间才能筛选出来. 方法2. 下面我们从另外一个角度

生成N个不相等的随机数

最近项目中需要生成N个不相等的随机数,实现的时候,赶工期,又有项目中N很小(0-100)直接谢了一个最直观的方法: public static List<Integer> randomSet(int num,int threshold){ Random random = new Random(); if(num > threshold) return null; Set<Integer> randomset = new HashSet<Integer>(); wh

C#生成一个符合正态分布(高斯分布)的随机数

//随机产生一个符合正态分布的数 u均数,d为方差 public static double Rand(double u, double d) { double u1, u2, z, x; //Random ram = new Random(); if (d <= 0) { return u; } u1 = (new Random(GetRandomSeed())).NextDouble(); u2 = (new Random(GetRandomSeed())).NextDouble(); z

生成一定数量的不重复随机数

/* * array unique_rand( int $min, int $max, int $num ) * 生成一定数量的不重复随机数 * $min 和 $max: 指定随机数的范围 * $num: 指定生成数量 * 说明: 生成随机数时用了 mt_rand() 函数.这个函数生成随机数的平均速度要比 rand() 快四倍. 去除数组中的重复值时用了“翻翻法”,就是用 array_flip() 把数组的 key 和 value 交换两次.这种做法比用 array_unique() 快得多.

Java连载81-枚举类型,生成五个不重复的随机数,集合简介

一.枚举类型 1.枚举类型的格式就是enum+枚举类型的名称,可见下面的例子. package com.bjpowernode.java_learning; ? public class D81_1_ { public static void main(String[] args) { /** * 需求:定义一个方法,该方法的作用是计算两个int类型数据的商 * 如果计算成功则该方法返回1,如果执行失败则该方法返回0 * * 程序执行成功,但是该程序存在风险,分析:存在什么风险? * * 程序中