日期:2014-05-18 浏览次数:21032 次
int[] numbers = new int[100];
for (int i = 0; i < 100; i++)
numbers[i] = i;
Random rd = new Random();
int index, realLength = numbers.Length, temp;
for (int i = 0; i < 100; i++)
{
index = rd.Next(realLength);
Response.Write(numbers[index] + "<br/>");
temp = numbers[index];
numbers[index] = numbers[realLength - 1];
numbers[realLength - 1] = temp;
realLength--;
}
------解决方案--------------------
我不是很确定,但是帮lz问dalmeeme一个问题。
比如对1~10洗牌,洗牌足够多次,那么统计每个位置上出现某个数字应该都在1/10,是不是这样。
如果你有VS,可以统计下,就很简单了。
------解决方案--------------------
1. for i:=1 to n do swap(a[i], a[random(1,n)]);
2. for i:=1 to n do swap(a[i], a[random(i,n)]);
推算:n=10;for(;i<=10;)
如果第二种,只要前面9个随机数有一个得10,那么肯定有重复了,因为第10个随机数必定是10,这样重复的机率更大,范围小了,随机的重复可能性更大,所以越后面,重复可能性越大,毫无交疑问的。
------解决方案--------------------
dalmeeme,我请教你一个问题。
产生100个[0-10)的随机整数,你看下面的算法是随机的么?(假设rnd(x, y)是随机的产生[x, y]的整数)
int[] result = new int[100];
for (int i = 0; i < 100; i++)
{
if (i > 0)
{
if (result[i - 1] == 9)
result[i] = rnd(0, 9);
else
result[i] = rnd(result[i - 1] + 1, 9);
}
else
{
result[0] = rnd(0, 9);
}
}
------解决方案--------------------
唉,技术论坛上何必吵架......
总不能去学那些口水论坛,没事就互相攻击着玩吧
------解决方案--------------------
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
srand(time(NULL));
printf("shuffle 0..n-1 demo\n");
for (n=1;n<=5;n++) {/* 测试1~5个元素 */
printf("_____n=%d_____\n",n);
j=1;
for (c=1;c<=n;c++) j=j*c;/* j为n! */
j*=n*2;
for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
for (i=n;i>0;i--) {/* 打乱0~n-1 */
a=i-1;b=rand()%i;
if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
}
printf("%04d:",c);
for (i=0;i<n;i++) printf("%d",d[i]);