获取随机数算法

y_haoo 2016-06-03 08:57:18
现有1至10000000,共一千万个数,每次随机抽取10个数存到数据库,保证每次抽取的数据没有重复,各位大神有何好建议...
...全文
455 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzc891013 2016-06-06
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
Enumerable.Range(1,10000000).OrderBy(d=>Guid.NewGuid())

然后按分页思路循环每次取10条存数据库即可,即第一次就将所有数据全部打乱了,后面只是分批保存

正解
xuzuning 2016-06-04
  • 打赏
  • 举报
回复
Random 的随机周期是 65536 所以你必须要备案已经取走的数字
crystal_lz 2016-06-03
  • 打赏
  • 举报
回复

int[] nArrDatas = new int[10000000];/
//这里面不会有一个重复数据 但是是顺序的
for(int i = 0;i < nArrDatas.Length;i++) nArrDatas[i] = i;
Random rnd = new Random();
for(int i = 0;i < nArrDatas.Length;i++){
    //所以说遍历一次 把当前索引数据和一个随机索引数据交换
    int nIndex = rnd.Next(nArrDatas.Length);
    int Temp = nArrDatas[nIndex];
    nArrDatas[nIndex] = nArrDatas[i];
    nArrDatas[i] = temp;
}
//此时nArrDatas是乱序的 每次取出十个就是了
如果 你一批数据只用一次的话 没有必要这么浪费空间

list<int> lst = new List<int>();
Random rnd = new Random();
int nCount = 10;
while(nCount >0){
   int num = rnd.Next(10000000);
   if(lst.Containt(num)) continue;
   lst.Add(num);
   nCount--;
}
连续生成十个 0-10000000 出现重复的概率太小了 可以直接用上面的方式 还没有那么浪费空间
  • 打赏
  • 举报
回复
var datas = new List<int>();
var rnd = new Random();
while (datas.Count < 10)
{
    var x = rnd.Next(1000000000);
    if (!datas.Contains(x))
        datas.Add(x);
}
  • 打赏
  • 举报
回复
var datas = new List<int>();
var rnd = new Random();
while (datas.Count < 10)
{
    var x = 以rnd为标志从数据库中随机取数(rnd);
    if (!datas.Contains(x))
        datas.Add(x);
}
就是一个简单的算法问题。你应该会用心“做”,而不是只会提要求。
  • 打赏
  • 举报
回复
随机数,怎么可能没有重复。 要从一堆数字中剔除重复的数字,那是很自然地算法。但是这跟随机数根本没有什么纠结,根本就是相互促进、“一前一后”协同处理的环节。而你纠结在一起,就把简单的事情弄复杂了。
正怒月神 2016-06-03
  • 打赏
  • 举报
回复
1楼正解
  • 打赏
  • 举报
回复
Enumerable.Range(1,10000000).OrderBy(d=>Guid.NewGuid())
然后按分页思路循环每次取10条存数据库即可,即第一次就将所有数据全部打乱了,后面只是分批保存
Conmajia 2016-06-03
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
Enumerable.Range(1,10000000).OrderBy(d=>Guid.NewGuid())
然后按分页思路循环每次取10条存数据库即可,即第一次就将所有数据全部打乱了,后面只是分批保存
如果需要处理1000亿条数据呢?1000000亿条呢?如果硬件存储容量不足以存下这么多数,又应该用什么办法解决呢?
qq_35151537 2016-06-03
  • 打赏
  • 举报
回复
现有1至10000000,共一千万个数,每次随机抽取10个数存到数据库,保证每次抽取的数据没有重复,各位大神有何好建议... ----------------- 看错了。。。 这个只能用 GUID 和 红黑表 。将一千万个数放到表里, 再10个一组输出。前提是你电脑的内存得够。
qq_35151537 2016-06-03
  • 打赏
  • 举报
回复
要用字典。收集去重。

        Dim R As New Random()
        Dim D As New Dictionary(Of Int32, Int32)
        While (D.Count < 10)
            Dim I As Int32 = R.NextDouble() * 100000
            D.Item(I) = I
        End While
        Me.Text = D.Count
空白桑 2016-06-03
  • 打赏
  • 举报
回复
http://www.jb51.net/article/66255.htm
xdashewan 2016-06-03
  • 打赏
  • 举报
回复
引用 8 楼 y_haoo 的回复:
求指教。。
随意方式生成种子表1-1千万,种子表用完可以删除。定义随机数表,三个字段自增id,随机数,使用状态,利用Insert into 随机表(xxx) select (xxx) from 种子表 order by NewID()的方式把种子表的数字乱序插入随机表,使用的时候每次top10后记得把使用状态变更掉,下次就仍然可以top10
y_haoo 2016-06-03
  • 打赏
  • 举报
回复
引用 6 楼 xdashewan 的回复:
直接一句sql就够了,还用程序再往数据库插,是不是麻烦了点
求指教。。
y_haoo 2016-06-03
  • 打赏
  • 举报
回复
引用 5 楼 shingoscar 的回复:
[quote=引用 4 楼 y_haoo 的回复:] [quote=引用 1 楼 starfd 的回复:]
Enumerable.Range(1,10000000).OrderBy(d=>Guid.NewGuid())
然后按分页思路循环每次取10条存数据库即可,即第一次就将所有数据全部打乱了,后面只是分批保存
第n次来取值的时候就不能包含前面已经取过的值,怎么处理呢[/quote] 就是让你先生成1千万个,打乱顺序,以后就从这队列里拿[/quote] 嗯嗯,了解了
xdashewan 2016-06-03
  • 打赏
  • 举报
回复
直接一句sql就够了,还用程序再往数据库插,是不是麻烦了点
Poopaye 2016-06-03
  • 打赏
  • 举报
回复
引用 4 楼 y_haoo 的回复:
[quote=引用 1 楼 starfd 的回复:]
Enumerable.Range(1,10000000).OrderBy(d=>Guid.NewGuid())
然后按分页思路循环每次取10条存数据库即可,即第一次就将所有数据全部打乱了,后面只是分批保存
第n次来取值的时候就不能包含前面已经取过的值,怎么处理呢[/quote] 就是让你先生成1千万个,打乱顺序,以后就从这队列里拿
y_haoo 2016-06-03
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
Enumerable.Range(1,10000000).OrderBy(d=>Guid.NewGuid())
然后按分页思路循环每次取10条存数据库即可,即第一次就将所有数据全部打乱了,后面只是分批保存
第n次来取值的时候就不能包含前面已经取过的值,怎么处理呢

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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