公司要做卡系统,求卡号生成算法!

公司要做卡系统,对卡号要求:第一:不能重复,要唯一;第二:长度可控制,要在12位到18位之间;第三:不能让别人猜出来(没有绝对,只要很难猜就行)。
其实UUID很适合,但是太长了,而且我们做的是在电视遥控器上用,为了用户输入方便,要求全是数字的。上网查了太多的资料,但是没有一个有明确的答复的!我用的是java开发平台。最好有些示范性代码!谢谢!
[b]问题补充:[/b]
对于congjl2002的回答,我觉得是一个思路,但是能保证不重复吗?
[b]问题补充:[/b]
目前,我是这样做的,不知道可不可以。
首选在卡是一批一批生成的,将卡的批次加入到卡号里面,其它卡号中随机生成,只要保证同一批次的没有重复号就可以了。最后根据congjl的建议,对生成的号码加密后,生成几位校验码再插入其中,这样就安全了 

这个只要你自己想一个算法就可以了啊,增加位的校验,这样只要你公司里没人说,别人很难猜出是怎么加密的吧

[code="java"]
for (int i=100000000000; i<999999999999999999; i++) {
// print ^_^
}
[/code]

先生成序列 : 1 2 3 4.。。。。
然后对每个数组加上一个加密串 如:asdfasdf
然后加密‘1asdfasdf’串,生成二进制数据
把这个二进制转成数字就行了