三下五除二解决部分数据啐取的随机性和公平性。


假设一下,一个网站要在一块有限的地方为客户显示招聘信息,这块地方最多一次显示10条信息,但它向88个客户收了同样的钱(当然这是和客户预先达成协议了的),现在它要以公平的次数(次数不等会打破头),以随机的顺序显示这88条信息(顺序固定会使浏览者厌烦)。类似于此的情况在现实中很多,如为很多人多轮抽奖,随机是基本的,如果一个人抽了一等奖还中了二等奖甚至第三轮又中一等奖的话,你也等着被人扔鞋吧;再如公司为员工提供某种福利,而情况是僧多粥少的话,必须提供多次才能为所有的员工提供一次,机会公平也是最基本的,你也最好做到随机,因为你人为的把谁排在后面都不是件让人爽的事。
要做到以上两点最简单的办法是什么呢?(我的办法是三个步骤)
我想先看看大家的方案,看看谁的最简约,呵呵。
posted @ 2005-04-27 08:50 Lyn 阅读(2247) 评论(27)  编辑 收藏 所属分类: ASP.net

  回复  引用    
#1楼 2005-04-27 09:07 | Eric [未注册用户]
用MS的ADRotator可否?
  回复  引用  查看    
#2楼 [楼主]2005-04-27 09:13 | 仁渣      
兄弟,请在数据层面,不要表示层面,要是用Winform呢?要是用Winform又关程序,下次又要接着上次程序的的选择结果选呢(就是上次程序中选过了,这次就不选了)?
  回复  引用  查看    
#3楼 2005-04-27 09:16 | twodays      
用两个HashTable A和B,一开始都放在A里面,
从A里面随机抽取一个显示然后放到B里面,
直到A里面没有了,然后再从B里面抽取往A里面放。
  回复  引用  查看    
#4楼 2005-04-27 09:18 | twodays      
在数据层?
OK,给这两个HashTable在包装一下
让它记住从那个HashTable取的
然后外面都从这个外壳获取。

  回复  引用  查看    
#5楼 2005-04-27 09:19 | twodays      
还要接着上次?
那么不用HashTable了。用表吧。
汗。。。。我这一下子回了3次。。。。。


  回复  引用  查看    
#6楼 [楼主]2005-04-27 09:24 | 仁渣      
呵呵,你的这个思路和我开始的一样,不过后来我用了更方便的方法。
  回复  引用    
#7楼 2005-04-27 09:29 | mikespook [未注册用户]
似乎有点像洗牌算法~~~~
只要洗好牌,按顺序显示就OK~~显示完一遍,再洗牌~~~
  回复  引用  查看    
#8楼 2005-04-27 09:33 | lichdr      
完全随机不太可能
本要想把88个一起排列一下的,再随机取一个排列。但这时排列数也实在太大了。

现在欺骗一下,88个分为8组,一组11个,11的排列就少了。
每次取8组11的排列。就是能保证公平的。

就是说,其实出现的时候基本是会以11个一组一起出现的,如果某次某某跟某某在一块,下次也基本在一块,只是换了几个位置而已(不会超过11个)。反正等下次轮回来的时候,人家也忘了。

如果轮换次数多了,可以随机把88个重新分一次组

一时说不清楚。
  回复  引用  查看    
#9楼 [楼主]2005-04-27 09:45 | 仁渣      
@mikespook:
问题是显示完一遍并不一定是整数次次数,比如88个,每次10个,你第9次显示要浪费2个广告位。
@lichdr:
这么长还没说清楚,兄弟的。。。。
  回复  引用  查看    
#10楼 [楼主]2005-04-27 09:46 | 仁渣      
@lichdr :反正等下次轮回来的时候,人家也忘了。----万一有个记得的呢?哈哈
  回复  引用  查看    
#11楼 2005-04-27 10:09 | allanlau      
为了解决问题,做成滚动广告。呵呵,是不是不用动脑的最简单方法啊。
显示完一遍就如mikespook所说的洗牌。

  回复  引用  查看    
#12楼 [楼主]2005-04-27 10:12 | 仁渣      
是数据层面的,没见上面我说开始也想到用两个表来做吗
  回复  引用  查看    
#13楼 2005-04-27 10:44 | 牙神幻十郎      
我比较喜欢在数据库中通过排序来排列,表中有一个自动 selectcount自动表示选中的次数
例如这样:

select top 1 * from .. order by selectcount,newid()
  回复  引用  查看    
#14楼 [楼主]2005-04-27 10:51 | 仁渣      
# re: “这块布的艺术成分都几高唧!”“有几高啊?”“三、四层楼那么高啦。” 删除评论 修改评论
以员工福利为例,为员工表建一个int字段flag
select top x 员工ID from 员工表 order by flag,newid()
再update 员工表 set flag = flag + 1 where 选出的员工编号
仁渣 评论于 2005-04-27 08:53

哈哈,牙神跟我的做法一样,这是我早上写在另一个贴的答案。
  回复  引用    
#15楼 2005-04-27 11:06 | 重在掺和 [未注册用户]
那你的随机性如何保证?
  回复  引用  查看    
#16楼 [楼主]2005-04-27 11:24 | 仁渣      
随机性如何没有保证?
  回复  引用    
#17楼 2005-04-27 13:50 | 哈哈 [未注册用户]
仁渣能证明newid() 如何保证随机性嘛?
  回复  引用  查看    
#18楼 [楼主]2005-04-27 14:03 | 仁渣      
仁渣用事实证明。
要不要我证明一下Window能删除你硬盘上的一个文件。
  回复  引用  查看    
#19楼 2005-04-27 15:36 | 大厨师      
1+1=2 都是要证明的问题何况是newid()的随机性问题,
在一定程度上讲,这个问题是 “定理” 不是 “公理” ,公理不要证明,定理必须证明之后才能说他成立。

我就不明白,为什么你能保证随机性!?
  回复  引用  查看    
#20楼 [楼主]2005-04-27 15:41 | 仁渣      
这年头钻牛角的人还不少啊,
1、请你证明1+1=2;
2、请证明你是男人。
  回复  引用    
#21楼 2005-04-27 17:30 | robaggio [未注册用户]
随机性写个测试脚本统计一下就知道了,还是可以的,但是newid的方法在没有效率上的考虑,不过这种广告什么的数据也大不到哪里去:),另外就是只有sql2000好用:(
  回复  引用    
#22楼 2005-04-28 12:36 | 哈哈 [未注册用户]
要是我的数据源不是数据库呢?要是我的数据源只是xml文件呢?人渣傻了吧?
  回复  引用  查看    
#23楼 [楼主]2005-04-28 13:10 | 仁渣      
这世界还有人真傻啊,XML就不行了?
这里有叫人渣的吗?

“哈哈”多好的一个词,我说你怎么就。。。。。
  回复  引用    
#24楼 2005-05-02 17:59 | 淡淡的砂砂 [未注册用户]
这个东西我做广告系统的时候,就没想到好的解决办法.看楼主的了
  回复  引用    
#25楼 2005-05-18 11:21 | jeff [未注册用户]
# re: 三下五除二解决部分数据啐取的随机性和公平性。
# re: “这块布的艺术成分都几高唧!”“有几高啊?”“三、四层楼那么高啦。” 删除评论 修改评论
以员工福利为例,为员工表建一个int字段flag
select top x 员工ID from 员工表 order by flag,newid()
再update 员工表 set flag = flag + 1 where 选出的员工编号
仁渣 评论于 2005-04-27 08:53

哈哈,牙神跟我的做法一样,这是我早上写在另一个贴的答案。

你这种做法我觉得不妥,一个网站如果流量大的话,显示的次数很频繁,你这样没显示一条,就UPDATE一下,频繁的数据库修改操作,这样效率会很低,对流量小的合适。
  回复  引用  查看    
#26楼 [楼主]2005-05-18 11:41 | THIN(仁与渣)      
如果是在网站上显示一些新闻、公告之类的就不存在很大的公平性问题,只用newid()就行了。
  回复  引用  查看    
#27楼 2005-05-24 09:24 | 無常      
把88條記錄放到一個靜態循環鏈表中
每次讀取10個,循環進行

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-04-27 08:53 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: