0-9数字生成不重复的8位随机码<支持99999999个>

ccli_007 2007-09-25 11:24:20
0-9数字生成不重复的8位随机码:谁有好的方法啊??或是接近的方法。
...全文
1480 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
heixia108 2007-11-28
  • 打赏
  • 举报
回复
mark
daidodo 2007-11-28
  • 打赏
  • 举报
回复
一位一位生成的话怎么保证“不重复”呢?
jdz_ln 2007-11-28
  • 打赏
  • 举报
回复
用list保存0~99999999.
用Random生成0~i(i是list的长度)之间的随机数。
把生成的n位的list中元素保存起来。i--。list中n位的数清除。

命中100%。

vb.net伪代码
list1(初始化0~99999999数)
list2
while list1.length>0
n=random(0,list1.length)
list2.add(list1(n))
list1.remove(n)
end while
c51profanss 2007-11-28
  • 打赏
  • 举报
回复
可以与已生成的比较阿,重复的话继续生成随机数阿!
pptor 2007-11-22
  • 打赏
  • 举报
回复
从0-9 里面选8个数字组成以各数(注意0不可以开头) 不久可以了啊
wfwsm 2007-11-15
  • 打赏
  • 举报
回复
mark
c51profanss 2007-11-09
  • 打赏
  • 举报
回复
一位一位的生成不就行了,回头再组合成9位的
medie2005 2007-10-24
  • 打赏
  • 举报
回复
ls不就是随机洗牌算法嘛
abc130314 2007-10-24
  • 打赏
  • 举报
回复
和一位仁兄在另一个帖子争论中,受到启发。
终于悟出一种时间复杂度极低的算法。
(可以证明,任意一个数 在 任意位置的概率 都为 1/n)

因为内存不够,所以改成了7个9来算。总时间2秒

public class Main {

public Main () {
start ();
}

public static void main (String args[]) {
new Main ();
}

private void start () {
java.util.Random r = new java.util.Random ();
for (int i = 0; i < n; i++) {
int x = r.nextInt (i+1);
iarr[i] = iarr[x];
iarr[x] = i;
}
//
int m = 10;
for (int i = 0; i < m; i++) {
System.out.print (iarr[i] + " ");
}
}

private final int n = 1000*10000;
private int[] iarr = new int[n];

}

conanfans 2007-10-23
  • 打赏
  • 举报
回复
生成0-9999999个数,打乱顺序不就行了么?
abc130314 2007-10-19
  • 打赏
  • 举报
回复
上面的算法,没有优化,生成数据耗时间。
下面的算法改进了一下。生成所有数据半分钟左右。
+----------
| 0...999999
| .
| .
| .
| 99

public class Main {

public Main () {
start_1 ();
start_2 ();
}

public static void main (String[] args) {
new Main ();
}

private void start_1 () {
for (int i = 0; i < n; i++) {
byte j = 0;
while(j < m-1) {
int x = r.nextInt (m);
if (barr_1[i][x] == 0) {
j++;
barr_1[i][x] = j;
}
}
}
}

private void start_2 () {
int j = 0;
while(j < n) {
int x = r.nextInt (n);
int y = (int) barr_2[x];
if (y < m) {
j++;
barr_2[x]++;
int z = ((int) barr_1[x][y]) * n;
//System.out.println (x + z);
}
}
}

private final int s = 10000*10000;
private final int m = 100;
private final int n = s/m;
private byte[][] barr_1 = new byte[n][m];
private byte[] barr_2 = new byte[n];
private java.util.Random r = new java.util.Random ();

}


abc130314 2007-10-19
  • 打赏
  • 举报
回复
数据有点大,用了128m
start_1 (); 是即时输出(因为用boolean数组,所以内存小得多)
start_2 (); 是把数据存进数组,以便再处理(需要内存很大,不赞成使用)
如果要处理数据,可以用 start_1 (); 把数据保存进文件,再从文件中读取数据进行处理。

public Main () {
start_1 ();
//start_2 ();
}

public static void main (String[] args) {
new Main ();
}

private void start_1 () {
//布朗型默认为 false
boolean[] barr = new boolean[n];
//
java.util.Random r = new java.util.Random ();
int j = 0, x;
int m = n;
while(j < m) {
x = r.nextInt (n);
if (! barr[x]) {
j++;
barr[x] = true;
System.out.println (x);
}
}
}

private void start_2 () {
//整型默认为 0
int[] iarr = new int[n];
//
java.util.Random r = new java.util.Random ();
int j = 0, x;
int m = n;
//少循环一次,因为要生成 0
while(j < m-1) {
x = r.nextInt (n);
if (iarr[x] == 0) {
j++;
iarr[x] = j;
}
}
}

private final int n = 100000000;

}
andypig 2007-10-19
  • 打赏
  • 举报
回复
上面的char a【7】改为 char a【9】
andypig 2007-10-19
  • 打赏
  • 举报
回复
#include <iostream>
#include <time.h>
#include <string.h>

using namespace std;

const char b[10] = {'0','1','2','3','4','5','6','7','8','9'};

void randomString(int n);
//void outFile(char *sourceString);
/*
void outFile(char *sourceString)
{
ofstream ofile(“randomString”,ios::app);
}
*/
void randomString(int n)
{
char *tempString = new char[7];
// pfile
char a[7];
// int password;
int i,j,k;

j = 0;
// password = 0;
srand((unsigned)time(NULL));
for(k = 0; k < n; k++)
{
i = 0;
while (i < 8)
{
j=rand()%10;
a[i] = b[j];
i++;
}
a[6] = '\0';
strcpy(tempString, a);
cout<< tempString<<endl;
// outFile(tempString);
}

delete tempString;
}


void main()
{
randomString(100);

}
yuvotesyg518 2007-10-19
  • 打赏
  • 举报
回复
对0-9进行乱序排列(可以使用任何一种排序算法进行改进),然后取前8位,就是你要的随机码了!
原理就相当于洗牌后再抽牌,很简单吧,呵呵。
Tiger_Zhao 2007-09-26
  • 打赏
  • 举报
回复
To medie2005:
请问对任意 m 如何求得合适的 a、c?
Tiger_Zhao 2007-09-26
  • 打赏
  • 举报
回复
又出来了!?
#-(
Tiger_Zhao 2007-09-26
  • 打赏
  • 举报
回复
刚才的回复没了!?
想问问 medie2005 如何对任意 m 求 a、c?
medie2005 2007-09-26
  • 打赏
  • 举报
回复
To: Tiger_Zhao :

设{Y(i)}为随机序列,其线性同余生成式为Y(i+1)=(a*Y(i)+c) mod m.
《计算机程序设计艺术》中给出了如下定理:

{Y(i)}周期长度为m,当且仅当:
1):c与m互素
2):对整除m的每个素数p,b=a-1是p的倍数
3):如果m是4的倍数,则b也是4的倍数。
中间件XL 2007-09-25
  • 打赏
  • 举报
回复
令n为10000000~99999999间数字不重复的数的个数,
求m=random(n),返回10000000~99999999间数字不重复的数的第m个
加载更多回复(4)

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧