| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3802 人关注过本帖
标题:[求助]:如何产生5000个0-10000的互不相同的随机数
只看楼主 加入收藏
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
以下是引用Knocker在2006-10-28 19:10:19的发言:

那楼上请给个算法瞧瞧

那你同意我的说法吗?


2006-10-28 19:21
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
得你的说法行得通才行

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-10-28 19:25
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 

我先说说你的为什么不行

#define N 10000

int a[N];
for (int i=0;i<N;i++) a[i] = i+1;//初始化

for(int i=0;i<N;i++)//这里运行次数可控
{
int n=rand()%N; //这里产生0~N-1中的随机数
int tem = a[i];
a[i]=a[n];
a[n]=tem;
}


int n=rand()%N; //这里产生0~N-1中的随机数,共N种交换状态
再加上for循环N次,可以说一共产生了N^N种状态
而N个数排列一共有N!种。因为N^N/N!不是整数,也就是说各种排列出现的数目(概率)不可能相等.

经我模拟.
当n=3时,所有结果中“2”在各位的概率分别为10/27,8/27,9/27。


2006-10-28 19:33
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
for(int i=0;i<N;i++)//这里运行次数可控

1.这里我所说的运行次数可控,指:
A, N不限于[QUOTE]#define N 10000 [/QUOTE]而是你可以调控,直到有你满意的效果
B, 甚至一个for不够,可以用两个for....

2.我的测试与你的结果不同
N为100,同样测试10次"2"在上面代码N*N调用后的分布
第0次
122 117 102 105 99 102 92 96 107 93 124 99 96 122 101 98 85 101 95 97 86 103 93 96 97 112 111 80 84 93 107 90 108 106 100 93
101 104 111 100 89 101 109 100 88 103 108 88 123 100 97 114 103 101 95 99 86 78 104 100 103 89 112 97 108 96 81 110 84 89 101 95 91 92 103 90 93 114 107 88 97 90 101 101 122 91 111 93 100 112 103 101 98 89 106 97 104 97 102 128
第1次
142 110 91 114 96 118 105 98 99 99 95 104 94 112 93 109 109 90
92 109 80 96 116 91 105 98 88 94 108 104 96 107 106 85 75 102
107 107 102 114 95 88 100 96 93 102 93 100 99 89 108 115 105
108 104 97 108 88 103 100 88 104 98 100 89 114 93 99 99 90 105
109 93 97 98 98 104 97 82 91 110 103 94 92 102 106 82 109 102
107 97 116 93 118 95 78 92 100 112 93
第2次
134 85 91 99 93 94 102 84 125 102 88 100 96 85 125 96 89 90 88 107 103 115 110 94 96 79 99 110 93 105 94 127 87 91 82 99 98
101 113 103 95 93 96 109 89 91 91 98 100 86 97 92 95 114 91
96 107 112 106 125 89 89 96 103 91 92 104 108 100 99 99 105 79
90 113 89 108 111 103 98 104 121 93 106 99 88 101 94 100 88 94
101 109 111 112 104 121 113 110 110
第3次
137 105 99 93 93 110 101 107 104 89 93 77 94 109 77 96 98 106
95 102 92 98 106 93 108 96 110 87 112 109 103 94 116 104 107 92 101 106 98 85 108 86 108 100 104 105 116 88 88 79 109 85 102
104 99 96 107 125 90 118 81 98 95 105 104 103 112 103 92 113 92 84 85 82 117 102 110 115 87 103 100 102 94 94 96 105 94 94 9
6 107 111 113 123 115 95 87 93 93 90 96
第4次
148 85 79 84 91 101 109 97 92 109 91 94 116 105 94 112 102 92
101 107 120 117 90 99 100 108 93 80 116 104 103 111 125 104 92
118 101 83 99 88 107 92 90 94 90 95 90 97 98 83 105 97 112 108 117 107 84 100 94 106 103 82 92 97 113 93 108 96 97 100 86 1
04 88 115 90 92 95 100 92 113 80 84 98 108 109 100 109 108 87
93 113 89 119 98 103 125 92 98 114 91
第5次
132 99 99 91 102 99 109 98 106 94 96 96 101 91 103 91 85 103
127 96 102 79 84 91 93 97 119 95 86 88 78 91 106 110 122 94 109 111 112 108 100 94 102 116 99 109 85 87 77 104 102 96 80 100
98 106 96 117 90 91 117 99 125 84 110 84 109 107 85 111 109 101 121 95 96 103 116 101 96 87 99 93 95 94 99 98 88 107 107 96
102 102 113 106 107 102 97 91 108 98
第6次
136 105 103 99 106 84 93 83 92 90 86 120 116 101 113 99 88 107
98 85 111 93 92 92 101 119 98 98 98 71 106 100 92 99 83 104
95 115 112 101 94 90 102 91 109 93 107 94 91 116 96 103 99 95
115 96 114 110 101 100 103 107 93 107 90 112 99 109 99 92 93 88
108 102 81 103 101 117 93 107 103 93 118 117 86 95 118 83 96
96 98 82 109 101 106 106 85 106 86 112
第7次
131 97 92 83 124 105 115 109 92 102 107 105 105 112 100 83 95
101 109 90 100 95 95 90 97 91 101 114 97 114 93 109 100 86 92
100 113 103 103 104 106 99 95 100 93 128 92 103 95 107 124 91 101 99 99 90 95 97 97 100 90 91 95 101 102 113 105 104 85 97 91
83 101 99 94 103 107 94 101 88 116 96 110 87 91 100 103 84 93
93 98 103 111 92 93 89 109 91 113 119
第8次
124 96 104 96 104 100 92 97 102 91 126 99 114 109 105 109 111
90 102 75 103 90 107 88 94 118 90 88 89 97 105 102 107 100 95
108 102 92 104 105 106 104 104 100 98 87 98 112 99 94 110 102 106 92 101 119 89 86 127 110 104 109 98 90 94 93 102 96 100 110
91 85 100 76 105 102 92 87 92 84 100 106 114 110 101 90 96 109
102 103 98 94 85 109 93 97 99 114 81 115
第9次
155 93 101 99 102 106 99 89 113 118 109 94 83 114 92 91 89 103
79 95 111 82 93 104 94 103 114 98 105 98 107 110 89 107 107 92 95 129 87 94 84 94 99 95 101 92 98 111 99 114 94 123 121 109
100 86 96 105 97 112 78 91 97 121 112 114 94 106 102 118 102
91 109 100 89 101 100 82 91 87 87 99 106 93 123 88 85 88 85 91
90 104 78 93 113 102 96 117 107 97 Press any key to continue...










九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-10-28 20:01
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
测试代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100
int main()
{


int a[N];
int b[N];

srand(time(NULL));
for(int y=0;y<10;y++)
{
printf("\n第%d次\n",y);
for(int i=0;i<N;i++)b[i]=0 ;
for(int o=0;o<N*N;o++)
{

for(int i=0;i<N;i++)a[i]=i+1 ;
//初始化

//这里运行次数可控
for(int i=0;i<N;i++)
{
int n=rand()%N ;
//这里产生0~N-1中的随机数
int tem=a[i];
a[i]=a[n];
a[n]=tem ;
}
for(int i=0;i<N;i++)
{
if(a[i]==2)b[i]++;//这里加个break;吧
}
}
for(int i=0;i<N;i++)
{
printf(" %d ",b[i]);
}
}
}

[此贴子已经被作者于2006-10-28 20:12:07编辑过]


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-10-28 20:03
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
从上述结果,for(int i=0;i&lt;N;i++)完全可以满足随机均匀分布

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-10-28 20:05
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
以下是引用Knocker在2006-10-28 20:01:13的发言:
for(int i=0;i<N;i++)//这里运行次数可控

你怎么控啊,你那个i是下标,变大a[i]越界,变小有部分数据未处理


2006-10-28 20:06
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
以下是引用我不是郭靖在2006-10-28 20:06:56的发言:

你怎么控啊,你那个i是下标,变大a[i]越界,变小有部分数据未处理

你不会再加一个for????


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-10-28 20:13
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
还可以

for(int i=0;i<N;i++)//这里运行次数可控
{
int n=rand()%N; //这里产生0~N-1中的随机数
int m=rand()%N;
int tem = a[m];
a[m]=a[n];
a[n]=tem;
}


这样不就行了?N可以任意

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-10-28 20:18
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
像你那种测试是不行的,要分析代码.
关键是这段代码产生的所有状态
for(int i=0;i<N;i++)
{
int n=rand()%N ;
int tem=a[i];
a[i]=a[n];
a[n]=tem ;
}

你把当N=3时,这段代码产生的所有状态写出来看看.共27种

2006-10-28 20:20
快速回复:[求助]:如何产生5000个0-10000的互不相同的随机数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040313 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved