找回密码
 点一下
查看: 2112|回复: 18

请问怎么随机整数并且不让它随机重复

[复制链接]
发表于 2011-9-4 10:43:17 | 显示全部楼层 |阅读模式
比如 我想让:
a1[1~5] = 狂热者
a1[1~5] = 狩猎者
a1[1~5] = 坦克
a1[1~5] = 大和
a1[1~5] = 机械哨兵

以上我是用的随机整数 不过 我想了一下这样弄 随机整数肯定要重复。请问怎么让他们不重复呀?
发表于 2011-9-4 11:05:25 | 显示全部楼层
通常这种状况我们使用“随机排序”而不是直接的随机整数。
回复

使用道具 举报

发表于 2011-9-4 11:27:33 | 显示全部楼层
额,每随机一个数字,把数组里面那个下标后面的数据全部左移一个下标。
回复

使用道具 举报

发表于 2011-9-4 15:37:43 | 显示全部楼层
可以使用沙发的方法,或者递归
设置一个函数,传递已经随机出来的随机数,返回结果
回复

使用道具 举报

 楼主| 发表于 2011-9-4 15:41:39 | 显示全部楼层
引用第1楼四夕水草肃于2011-09-04 11:05发表的  :
通常这种状况我们使用“随机排序”而不是直接的随机整数。

随机排序在哪里?我搜索了一下 没有呀
回复

使用道具 举报

 楼主| 发表于 2011-9-4 15:42:30 | 显示全部楼层
引用第2楼frozenleave于2011-09-04 11:27发表的  :
额,每随机一个数字,把数组里面那个下标后面的数据全部左移一个下标。
  

这样做的话 貌似还是会重复
回复

使用道具 举报

发表于 2011-9-5 09:37:14 | 显示全部楼层
楼主,你可以设置a[1]~a[5],分别为不同的单位。
然后随机1~5的数2个,对调这两个数对应的单位。
然后反复执行n次,次数越多,随机性越高。

例如
a1[1] = 狂热者
a1[2] = 狩猎者
a1[3] = 坦克
a1[4] = 大和
a1[5] = 机械哨兵

随机到3,5则
a1[1] = 狂热者
a1[2] = 狩猎者
a1[3] = 机械哨兵
a1[4] = 大和
a1[5] = 坦克

随机到两个数相同,则不会发生改变3和3对调还是原样而已。

对调只用一个中间变量。
例如
a1[1] = 狂热者
a1[2] = 狩猎者
a1[3] = 机械哨兵
a1[4] = 大和
a1[5] = 坦克
随机到1,4
设置b=a1[1]  狂热者
设置a1[1]=a1[4]  大和
设置a1[4]=b 狂热者

a1[1] = 大和
a1[2] = 狩猎者
a1[3] = 机械哨兵
a1[4] = 狂热者
a1[5] = 坦克
回复

使用道具 举报

发表于 2011-9-5 10:23:58 | 显示全部楼层
系统当然没有随机排序函数拉~,需要你自己写哦~
回复

使用道具 举报

发表于 2011-9-5 11:20:16 | 显示全部楼层
[codes=galaxy]
string[6] a1;

void aaa(){
    string[6] unit_id;
    int[6] array_num;
    int n = 1;
    int max = 5;
    int r;
    int s;

    unit_id[1] = "狂热者";
    unit_id[2] = "狩猎者";
    unit_id[3] = "坦克";
    unit_id[4] = "大和";
    unit_id[5] = "机械哨兵";

&#160;&#160;&#160;&#160;while(n<=max){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;r = RandomInt(n,max);

&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(array_num[r]!=0){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;s = array_num[r];
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;s = r;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;a1[n] = unit_id;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(array_num[n]==0){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;array_num[r] = n;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;array_num[r] = array_num[n];
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}

&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;n = n + 1;
&#160;&#160;&#160;&#160;}
}
[/codes]
方法就是把随机出来的数覆盖为即将排除的数就可以了。
回复

使用道具 举报

发表于 2011-9-5 11:24:27 | 显示全部楼层
其实frozenleave的方法就已经可以了,LZ自己多试试看吧。
回复

使用道具 举报

发表于 2011-9-5 12:07:37 | 显示全部楼层
引用第2楼frozenleave于2011-09-04 11:27发表的  :
额,每随机一个数字,把数组里面那个下标后面的数据全部左移一个下标。
  
优化算法,把随机到的数设置为列表末尾的数。
回复

使用道具 举报

发表于 2011-9-5 13:13:19 | 显示全部楼层
引用第10楼喂喂于2011-09-05 12:07发表的  :

优化算法,把随机到的数设置为列表末尾的数。
第一次随机数1~5
第二次1~4
第三次1~3
……
回复

使用道具 举报

发表于 2011-9-5 23:36:41 | 显示全部楼层
int b[100];
int num=0;
void Sort(int a[],int low,int high)
{
    if(low>high) return;
    int i=rand()%(high-low+1)+low;这里是随机 最小low最大high了。。。
    b[num++]= a[ i ] ;
    Sort(a,low,i-1);
    Sort(a,i+1,high);
}
把数组a里面的数随机排序放到b里头。。。
递归不用移动下标,应该是比较好的算法了吧,我不知道还有木有其它更好算法。
回复

使用道具 举报

发表于 2011-9-6 02:42:26 | 显示全部楼层
我怎么看这代码好像根本没会用 a[]的任何数据啊?
回复

使用道具 举报

发表于 2011-9-6 12:41:10 | 显示全部楼层

回 13楼(喂喂) 的帖子

改了,b【num++】=a【i】
。。。。。就是下标是随机出来的,汗居然漏掉了。。。
回复

使用道具 举报

发表于 2011-9-9 10:55:23 | 显示全部楼层
http://bbs.islga.org/read-htm-tid-265848.html
lz在war3那边也问过类似的问题,就是一个洗牌而已啊……

其实还可以根据情况优化
如果要取得个数m远小于元素总数n,那么只需要对于前m个元素中每次将第i项与第i项到第n项的随机一项交换(i=0,1,2,...m),再取交换过的这前m项即可
如果m与n接近,那么老老实实多洗几次好了

话说洗牌不是shuffle么
回复

使用道具 举报

发表于 2011-9-9 15:52:22 | 显示全部楼层
这样和a1[1] a1[2] =随机单位有区别嘛…
回复

使用道具 举报

发表于 2011-9-10 00:10:58 | 显示全部楼层
没有区别~
甚至连“如何随机单位类型且不重复”这样的问题都没有区别。
回复

使用道具 举报

 楼主| 发表于 2011-9-10 10:53:05 | 显示全部楼层
对不起...我脑子比较笨... 还是没有听懂

尝试了N次还是不行....

求哪位好心人 发个演示上来 谢谢了

【我对我的伸手表示抱歉 不过没办法 只能伸手了】
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-27 22:58 , Processed in 0.035721 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表