concentrate on c/c++ related technology

plan,refactor,daily-build, self-discipline,

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  37 Posts :: 1 Stories :: 12 Comments :: 0 Trackbacks

常用链接

留言簿(9)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

实现这个有这三种办法:
1)随机排序,按照顺序先后取出M个数字。
 IntVec shuffle(IntVec& vec)
133 {
134 int size = vec.size();
135 IntVec::iterator first = vec.begin();
136 IntVec::iterator last = vec.end();
137 for(IntVec::iterator i = first + 1; i != last; ++i)
138 {
139 std::iter_swap(i, first + rand()%((i - first)+ 1));
140 }
141 return vec;
142 }
这个呢,不会影响源数组,这个
2)取M次,每次做个事情就是随机出一个数,添加到目标数组里面,然后从源数组中删除。。
143
144 IntVec shuffle(IntVec& vec, int count)
145 {
146     IntVec desVec;
147     for(int i = 0; i < count;i++)
148     {
149         int random = rand()%vec.size();
150         desVec.push_back(vec[random]);
151         vec.erase(remove(vec.begin(),vec.end(),vec[random]),vec.end());
152     }  
153     return desVec;
154 }
这个呢,会影响源数组。
3)取M次,借助一个辅助数组记录哪个数据被取过,随机出一个数,添加到目标数组里面,然后将这个值添加到辅助数组里面.
 IntVec shuffle2(IntVec& vec, int count)
158 {
159     IntVec desVec;
160     IntVec flagVec;
161     for(int j = 0; j < count; j++)
162     {
163         flagVec.push_back(0);
164     }
165     for(int i = 0; i < count;i++)
166     {
167
168         int random = rand()%vec.size();
169         if (flagVec[random] == 0)
170         {
171             desVec.push_back(vec[random]);
172             flagVec[random] = 1;
173         }
174         else
175         {
176             i--;// 如果已经取过了,这次不算.
177         }
178
179     }
180     return desVec;
181 }
posted on 2016-04-02 11:51 jolley 阅读(547) 评论(0)  编辑 收藏 引用 所属分类: 数据结构与算法

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理