如何精确产生不重复随机数,

NucleusCode 2012-09-20 11:28:50
比如在10范围内产生10个不重复的数字


for(i=0; i<10; ++i)
{
num = rand() % 10;
}


上面这种情况怎么能让他产生的10 个数字不重复?

要求只允许循环10次,产生的数字必须在 0 - 10以内


正确的结果
0 5 6 2 1 3 7 4 8 9
5 2 3 7 8 9 0 6 1 4

错误的结果
0 0 6 2 1 3 2 8 9 4

...全文
138 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alex20150716 2012-09-20
  • 打赏
  • 举报
回复
思路+算法+代码=
Coder_Y_Jao 2012-09-20
  • 打赏
  • 举报
回复
我错了,原来是C语言的板块
NucleusCode 2012-09-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

C/C++ code

#include <vector>
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;


int VecRandom(int num)
{
return rand() % num;
}
int main()
{
srand ( unsigned (……
[/Quote]

3Q
不过我用的是纯C写的,,,
Coder_Y_Jao 2012-09-20
  • 打赏
  • 举报
回复
std里的东西,没说不可以用吧
Coder_Y_Jao 2012-09-20
  • 打赏
  • 举报
回复

#include <vector>
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;


int VecRandom(int num)
{
return rand() % num;
}
int main()
{
srand ( unsigned ( time (NULL) ) );
int Array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
vector<int> Vec( Array, Array + _countof( Array ) );
random_shuffle( Vec.begin(), Vec.end(), VecRandom);
copy ( Vec.begin(), Vec.end(), ostream_iterator<int> (cout, "\n") );
return 0;
}
baichi4141 2012-09-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
这样貌似效率会很低
因为我的程序整体会很大
有可能需要随机 上千上万个 这样的固定范围随机序列
[/Quote]
随机N次,每次记录下来当前次数和随机结果
然后对随机结果进行快排,交换时保证当前次数和随机结果一直绑定
随机结果排序完成后,当前次数序列就是你需要的

方法很多,多想想吧
NucleusCode 2012-09-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

各种变通的方法有很多
比如在平面坐标系下随机十个坐标,按横纵坐标排序得到这十个坐标的顺序,也满足楼主的结果

关键就是,如果一次随机所需要得到的结果和另一次随机的结果相关,那这次随机就不能称为完全随机
例如按楼主的要求,最后一次根本不需要随机,直接把0~9最后一个还没出现的数补上就行了,只有一个可以选择的结果,这算哪门子随机?
[/Quote]

我要的就是随机序列
例如随机范围 10
那么我要 0 - 9 十个数字乱序排列出来

而不是 有规律的出现10 个数字
NucleusCode 2012-09-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

洗牌法.
[/Quote]

求算法 ..
NucleusCode 2012-09-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

每次都在前一次的结果上随机
例如第一次随机出了6,第二次如果出6就重新随机,第十次就不用随机了,直接把剩下的那个数填上完事
[/Quote]

这样貌似效率会很低
因为我的程序整体会很大
有可能需要随机 上千上万个 这样的固定范围随机序列
qq120848369 2012-09-20
  • 打赏
  • 举报
回复
洗牌法.
baichi4141 2012-09-20
  • 打赏
  • 举报
回复
各种变通的方法有很多
比如在平面坐标系下随机十个坐标,按横纵坐标排序得到这十个坐标的顺序,也满足楼主的结果

关键就是,如果一次随机所需要得到的结果和另一次随机的结果相关,那这次随机就不能称为完全随机
例如按楼主的要求,最后一次根本不需要随机,直接把0~9最后一个还没出现的数补上就行了,只有一个可以选择的结果,这算哪门子随机?
baichi4141 2012-09-20
  • 打赏
  • 举报
回复
每次都在前一次的结果上随机
例如第一次随机出了6,第二次如果出6就重新随机,第十次就不用随机了,直接把剩下的那个数填上完事

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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