软件功能
1、随机生成数字,支持重复和不重复两种模式,开始和结束数字任意自定义,支持0-9999。
2、不重复的模式下,可以实时看到剩余多少个可以摇。
3、抽签、抽奖、点名、分组、彩票选号等都可以用的到。
4、摇号记录会自动保存,并支持复制到剪贴板
给你VBA代码Sub 摇号器()
Static n As Integer
Randomize
n = n + 1
s = "第" &n &"组:"
For i = 0 To 9
s = s &Int(10 * Rnd)
Next
Cells(n, 1) = s
End Sub
这两天看了一下,可以用这个。
http://www.cnblogs.com/eaglet/archive/2011/01/17/1937083.html#!commentsJS代码:
function Rnd(n, m) {
var s = []
var o = []
for (var i = 1 i <= n i++) {
s.push(i)
}
for (var i = 0 i < m i++) {
var j = n - i
var l = Math.floor(j * Math.random())
o.push(s[l])
s[l] = s[j - 1]
}
return o
}
list封装:
static IEnumerable<T> GetRandomSequence<T>(IList<T> array)
{
var rnd = new Random()
var list = array.ToList()
while (list.Count >0)
{
var point=rnd.Next(0,list.Count)
var rv=list[point]
list[point] = list[list.Count - 1]
list.RemoveAt(list.Count - 1)
yield return rv
}
}
扩展算法:
public static void RandomPermute<T>(this IList<T> data)
{
int count = data.Count
for (int i = 0 i < count i++)
{
int index0 = Random.Next(0, count - i)
int index1 = count - i - 1
T tmp = data[index0]
data[index0] = data[index1]
data[index1] = tmp
}
}
算法改进:
1、直接在原数组内交换位置即可,《算法导论》中有这个算法:
(1) 从N个数中随机取出一个数,与数组第一个数调换
(2) 从后N-1个数中随机取出一个数,与第二个数调换
2、让0表示第i项的值为i,输出或者交换的时候遇到0则输出下标,其余值减一。这样可以省掉初始化循环,
3、只用一个数组
public static int[] GetRandom(int total)
{
int[] array = new int[total]
for (int i = 0 i < total i++)
{ array[i] = i }
Random random = new Random()
int temp2
int end = total
for (int i = 0 i < total i++)
{
int temp = random.Next(end)
temp2 = array[temp]
array[temp] = array[end - 1]
array[end - 1] = temp2
end--
}
return array
}