当前位置: 爱符号 - 所有分类 - 桌面应用 - C# - 一个简单的抽奖算法,机率问题?
一个简单的抽奖算法,机率问题? YiGeJianDanDeChouJiangSuanFa,JiLvWenTi?
符号空间 发表于:2013-12-26 16:35:01 阅读(1376)
关键词:抽奖 抽奖 算法 算法 机率 机率 C# C# SQL SQL 随机 随机
摘要:这个可能很多人做过的,各有各的解决办法吧。 1.分别1000次 10000次调用这个算法 2.此算法会在每次调用的时候输出两个值,0 1

下面是要求:

1.分别1000次 10000次调用这个算法
2.此算法会在每次调用的时候输出两个值,0 1
3.最高输出1的次数不能超过5
4.输出1的次数可以少于5,甚至是0次
5.输出1的次数不能太过密集,比如前面5次都是1
其实这个就是抽奖的算法,


这个可能很多人做过的,各有各的解决办法吧。

下面我放出两个算法,稍有一点点差异(语言不同)


C#

        static void TestLottory(int count) {//测试次数
            _current = 0;
            Console.WriteLine("------------------");
            for (int i = 0; i < count; i++) {
                //这就是逻辑清楚之处,不管怎么判断,我只管调用就行了
                //改规则时,不会导致这里一团糟
                if (Lottory()) {
                    Console.WriteLine("No.{0} 中", i + 1);
                }
                if (_current == _max)//你不觉得后面的循环已经无意义了吗?
                    break;
            }
        }
        static int _max = 5;//最大值
        static int _current = 0;//当前已中次数
        static Random _random2 = new Random(Environment.TickCount);//.NET的这个以时钟为准的,不固定一个,它会跑成一样的
        static bool Lottory() {
            //已经抽完了
            if (_current >= _max) 
                return false;
            int n = _random2.Next(1000000, 9999999);//过大的数字,让机率更分散
            int n1 = _random2.Next(1000000, 9999999);

            //同时满足:A被2整除 B被7整除 A与B之和被6整除  这个数字很变态吧?
            if (n % 2 == 0 && n1 % 7 == 0 && (n1 + 1) % 6 == 0) {
                _current++;
                return true;
            }
            return false;
        }
        [STAThread]
        static void Main() {
            TestLottory(10000000);//这么多次其实是浪费的,越到后面是没机会的,这个不是重点
        }


下面是SQL SERVER 2005中写的,没有写什么注释了

declare @max int,@current int
set @max=5
set @current=0

declare @count int,@i int
set @count=100000
set @i=0

declare @t table(id int identity(1,1) not null,i int,n int,n1 int)

declare @n int,@n1 int
while(@i<@count and @current<@max)
	begin
		set @i=@i+1
		set @n=(rand()*1000000)
		set @n1=(rand()*1000000)
		if(@n % 2=0 and @n1 % 7 =0 and (@n+@n1) % 6 =0)
			begin
				set @current=@current+1
				insert into @t(i,n,n1) values(@i,@n,@n1)
			end
	end
select * from @t


这个原本是我放在群里面的一个题,做出来的可以得到我的迅雷白金版子帐号一个,使用权限:1个月。

不过貌似这个没有送出去?

QQ群号:112481823



这只是算法层面的测试,实际应用中还有一些特殊处理:

1.最大值是奖品上控制的,每一个奖品每天被抽中的次数是不一样的;
2.每次抽的时候,抽哪一个奖品也是不固定的
3.有的奖品可能显示在外可以抽的,但内部控制为:强制抽不中;
4.奖品有剩余数量的,就算今天5个要送出还没有送完,但不好意思,总量没有了;
5.有的奖品开展的活动有时间限制的,没到时间不会在可抽范围内,到了时间就更不用说了;
6.有的奖品不管你抽不抽,它都有时间限制的,比如优惠劵,到了某个时间后,它就已经作废了;

如果还有别的意见,可以跟在后面。





声明:以上内容仅代表作者观点,不代表爱符号赞成此内容或立场
抽奖相关的分享
 
  • ·暂无相关分享
  •  
算法相关的分享
 
机率相关的分享
 
  • ·暂无相关分享
  •  
C#相关的分享
 
SQL相关的分享
 
随机相关的分享
 
  • ·暂无相关分享
  •  
作者热播