免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7046 | 回复: 10
打印 上一主题 下一主题

[算法] 谁有生成充值卡号的算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-28 16:49 |只看该作者 |倒序浏览
最近需要生成一批15或者20位的充值卡,类似移动充值卡的东西,不知道哪位兄弟又没有现成的算法?

或者哪个哥们来讲讲生成卡号的原理。

我想到的无非是用base64或md5的方式生成一串数字,但感觉不严谨

论坛徽章:
0
2 [报告]
发表于 2006-02-28 17:50 |只看该作者
卡号是用来干什么的,唯一标识么? 1,2,3,4 ... 行不行?

论坛徽章:
0
3 [报告]
发表于 2006-02-28 18:04 |只看该作者
主要给用户进行帐号充值用,不仅仅是唯一标示,至少不能被人猜出规则来。

论坛徽章:
0
4 [报告]
发表于 2006-02-28 18:50 |只看该作者
就是像神州行那样的卡,刮开后得到一个号码,用该号码就可以给任意手机号充值?

预计的用户数为 x,则在一个远远大于 x 的范围里抽取 x 个随机数,估计就行了。比如让他猜测的平均个数超过 2^{64}。

论坛徽章:
0
5 [报告]
发表于 2006-02-28 19:43 |只看该作者
good idea

论坛徽章:
0
6 [报告]
发表于 2006-02-28 21:06 |只看该作者
可以考虑使用现成的uuid库

论坛徽章:
0
7 [报告]
发表于 2006-03-01 17:26 |只看该作者

写了一个程序来实现

根据win_hate的意见写了一个生成号码的程序,效率一般,功能差不多可以实现。
ID_MAX_LEN:号码长度
VEC_SIZE:号码数量
更改这两个值可以生成不同的长度和数量的不重复的号码。
兄弟们看看,多提意见。



  1. #include <iostream>
  2. #include <vector>
  3. #include <stdlib.h>
  4. #include <string>
  5. #include <fstream>
  6. #include <algorithm>

  7. using namespace std;
  8. const int ID_MAX_LEN = 10;
  9. const int VEC_SIZE = 100000;

  10. int main(int argc, char *argv[])
  11. {

  12.     int i,j;
  13.     vector<string> vec_id;

  14.     //set rand seed
  15.     srand((int)time(0));

  16.     //genarate rand vector
  17.     for( int ix = 0; ix < VEC_SIZE; ix++ )
  18.     {
  19.         char id[ID_MAX_LEN+1];
  20.         for( i = 0; i < ID_MAX_LEN; i++)
  21.         {
  22.             j = 0+(int)(10.0*rand()/(RAND_MAX+1.0));
  23.             id[i] = 48 + j;
  24.         }
  25.         id[ID_MAX_LEN] = '\0';
  26.         string s = id;
  27.         vec_id.push_back(s);
  28.     }
  29.    
  30.     //sort and erase the repeated elements
  31.     sort(vec_id.begin(), vec_id.end());
  32.     vector<string>::iterator new_end = unique( vec_id.begin(), vec_id.end() );
  33.     vec_id.erase( new_end, vec_id.end() );

  34.     //insert elements to replace the deleted elements   
  35.     while( vec_id.size() < VEC_SIZE )
  36.     {
  37.         while( vec_id.size() < VEC_SIZE )
  38.         {
  39.             char id[ID_MAX_LEN+1];
  40.             for( i = 0; i < ID_MAX_LEN; i++)
  41.             {
  42.                 j = 0+(int)(10.0*rand()/(RAND_MAX+1.0));
  43.                 id[i] = 48 + j;
  44.             }
  45.             id[ID_MAX_LEN] = '\0';
  46.             string s = id;
  47.             vec_id.push_back(s);            
  48.         }

  49.         //sort and erase the repeated element
  50.         sort(vec_id.begin(), vec_id.end());
  51.         vector<string>::iterator new_end = unique( vec_id.begin(), vec_id.end() );
  52.         vec_id.erase( new_end, vec_id.end() );        
  53.     }
  54.    
  55.     //write to the file
  56.     ofstream outfile( "id.txt" );
  57.     for( vector<string>::iterator iter = vec_id.begin(); iter != vec_id.end(); iter++ )
  58.     {
  59.         //cout << *iter << endl;
  60.         outfile << *iter << endl;
  61.     }
  62.     outfile.close();
  63.    
  64.   system("PAUSE");       
  65.   return 0;
  66. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2006-03-02 00:32 |只看该作者

回复 7楼 kunx 的帖子

这种生成一张充值卡算法使用vector每生成一张找以前生成的有没有重复,排一下续,效率应该比较差(如果vector的排序使用树那就不会差)比如一次生成50万张卡要执行50万次排序会慢的向牛一样;使用二叉树每生成一张遍历树中的节点重复就丢弃,不重复就插入相应位置,效率应该会提高许多。

论坛徽章:
0
9 [报告]
发表于 2006-03-02 09:24 |只看该作者
这个程序的思想是,如果需要生成50万张卡
那么先随机生成50万个数,然后去掉其中重复的值,用了STL的sort和unique
然后再生成随机数,凑足50万,再删掉重复的值
这种算法在重复值不是很多的时候,效率还是可以,一多就慢的要命

论坛徽章:
0
10 [报告]
发表于 2006-03-02 09:35 |只看该作者
效率是不是够要看需求是多少.
50万条已经是很小的数据量了.
在程序中可以使用STL的set绝对没有问题.
50万条作为一个平衡二叉树的话才20层不到.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP