产生随机数.数字越小出现的概率越大

qq43695548 2010-07-21 01:44:00
从0到360之间产生一个随机数,数字越小出现的概率越大
...全文
1504 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
GetStudyMessages 2010-07-21
  • 打赏
  • 举报
回复
Random ran = new Random()

int num = ran.Next(1,360)

int getNum = ran.Next(1,num)
qq43695548 2010-07-21
  • 打赏
  • 举报
回复
结贴

其实也就是一个数列求和问题

n的概率是(361-n)/sum,求前n项的和


justfortemp 2010-07-21
  • 打赏
  • 举报
回复
nnd 这是一个数学概率问题 楼主为什么要出个数学问题呢 我概率本来就不好
完了 脑子里纠结了
justfortemp 2010-07-21
  • 打赏
  • 举报
回复
不对 出现 1的概率是 2/360
justfortemp 2010-07-21
  • 打赏
  • 举报
回复
int a=rand(1,360)
int b=rand(1,360)
取a b 中最小的一个

想了下 完全可以满足楼主的要求

出现 360 360的概率是 1/(360*360)
出现 1的概率是 1/360
1出现的概率不就是360出现的概率的360倍吗

[Quote=引用 10 楼 justfortemp 的回复:]
多用几个随机
int a=rand(0,360)
int c=rand(0,360)
int b=rand(0,360)
取a b C 中最小的一个
一般两次随机就能够实现了 3次360就不好出现了
[/Quote]
段传涛 2010-07-21
  • 打赏
  • 举报
回复
Random ran = new Random();
int[] myarry =new int [10];
int n =0;
for (int i = 0; i < myarry.Length; i++)
{
myarry[n] = ran.Next(0,360);
n++;
}
Array.Sort(myarry );
foreach (int em in myarry)
{
Response.Write(em +"," );
}
leonbyron 2010-07-21
  • 打赏
  • 举报
回复
说个蠢办法,建一个数组,把1-360按概率往里扔,之后用random给出数组下标。
justfortemp 2010-07-21
  • 打赏
  • 举报
回复
9:45
8:44 43
7:42 41 40
6:39 38 37 36
5:35 34 33 32 31
4:30 29 28 27 26 25
3:24 23 22 21 20 19 18
2:17 16 15 14 13 12 11 10
1:9 8 7 6 5 4 3 2 1

程序应该好实现 怎么实现最优算法呢。
宇峰科技 2010-07-21
  • 打赏
  • 举报
回复
没试过啊
qq43695548 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wanghui0380 的回复:]
360,359-------2,1
等差数列求合得到sum值

rad(1,sum)就ok了,剩下的就是判定他在那个和值区间内
[/Quote]

是这样的
Neil198 2010-07-21
  • 打赏
  • 举报
回复
这样小的数的几率就大了,但是0-36之间出现的几率差不多,
可以把P范围设置在(1,100)
以下是 1-100的随机数出
6
12
1
1
0
0
7
18
2
2
83
1
6
0
4
0
1
3
2
12
0
24
0
1
0
0
1
29
1
34
1
2
3
0
2
1
3
5
3
4
2
0
165
0
301
3
4
2
5
2
22
1
4
3
0
12
7
17
3
1
92
1
2
0
112
1
16
13
1
0
0
4
1
4
15
4
0
4
1
12
2
0
7
29
1
7
4
4
6
6
5
0
0
0
4
15
2
0
5
6
fuxiyang 2010-07-21
  • 打赏
  • 举报
回复
需要提供概率密度吧
Neil198 2010-07-21
  • 打赏
  • 举报
回复

Random rd = new Random();

int p = rd.Next(1, 10);

result = rd.Next(0, 361 / p);

Console.WriteLine(result);

如果 P = 10 就随机 0-36
如果 p = 9 就随机 0-40
如果 p = 8 就随机 0-45
.....
如果 p=1 就随机 0-360

wanghui0380 2010-07-21
  • 打赏
  • 举报
回复
360,359-------2,1
等差数列求合得到sum值

rad(1,sum)就ok了,剩下的就是判定他在那个和值区间内

justfortemp 2010-07-21
  • 打赏
  • 举报
回复
不对
[Quote=引用 15 楼 justfortemp 的回复:]
这个要求出现概率跟数字本身有关系的,
比如,总数为1到360的和设为a,1出现的概率为360/a,360出现概率为1/a

sum=0+....+359;
int x=rand(0,sum)
x=x%360;
x=x+1;
大概思路是这样的 你看看怎么调整下x=0 的时候的情况
[/Quote]
justfortemp 2010-07-21
  • 打赏
  • 举报
回复
这个要求出现概率跟数字本身有关系的,
比如,总数为1到360的和设为a,1出现的概率为360/a,360出现概率为1/a

sum=0+....+359;
int x=rand(0,sum)
x=x%360;
x=x+1;
大概思路是这样的 你看看怎么调整下x=0 的时候的情况
justfortemp 2010-07-21
  • 打赏
  • 举报
回复
你的意思是 如果 1-360 360出现的概率是X 那么 1的概率是X*360是不是?
sxiaohui8709253 2010-07-21
  • 打赏
  • 举报
回复
这个概率是线性的么 好歹概率给个统计列表啥的 不然没法搞吧
justfortemp 2010-07-21
  • 打赏
  • 举报
回复
这个要求出现概率跟数字本身有关系的,
比如,总数为1到360的和设为a,1出现的概率为360/a,360出现概率为1/a

1 为360/a 360为 1/a
请问 2-359的概率为0?
qq43695548 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 justfortemp 的回复:]
多用几个随机
int a=rand(0,360)
int c=rand(0,360)
int b=rand(0,360)
取a b C 中最小的一个
一般两次随机就能够实现了 3次360就不好出现了
[/Quote]

这个要求出现概率跟数字本身有关系的,
比如,总数为1到360的和设为a,1出现的概率为360/a,360出现概率为1/a

加载更多回复(10)
delphi产生随机数2009-07-27 18:58//用delphi产生不重复的随机数 ****************************************************************************************** var aa : array[1..36] of string[2]; //aa数组为需要随机排列的数组,{先把1..36按顺序给aa数组赋值} procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin for i:=1 to 36 do begin aa[i]:=inttostr(i); bb[i]:=inttostr(i); end; end; {随机进行排列} procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; swapa:string[2]; begin randomize; //随机数初始化*一定要有,不然下次运行时候产生随机数仍然和这次相同* for i:=1 to 36 do begin j:=1+random(36); swapa:=aa[i]; aa[i]:=aa[j]; aa[j]:=swapa; end; //由此得到不重复的随机排列数字 ***************************************************************************************** 如何产生34-456之间的随机数 Randomize; 34+Random(456-34+1); ×××××××××××××××××××//下面是扫雷游戏的一个编法 procedure TForm1.Button1Click(Sender:TObject); begin Randomize; Memo1.Lines.Add(IntToStr(Random(20))); end; ×××××××××××× ***************************************************************************************** 随机数相关的几个函数: 1、RandSeed;//随时机数发生的“种子”。如果不赋值那么每次执行产生随机数列是一样的。 所以该值必须每次调用均应是不同值。 2、Randomize;//用当前机器时间作为“种子”初始化随机数发生器。 3、Random() ;//由“种子”初始化的随机数出发,开始产生随机数序列 但是Delphi中的Random()产生的是伪随机数,也就是说,程序的两次运行,Random()产生随机数是一样的。 先运行一下Randomize,再Random就是真正的随机数了 即: Randomize //初始化随机数发生器 Random() ********************************************************************************************* delphi 如何产生不重复随机数 pascal里的随机数 随机数是指理论上没有规律可循、在指定范围内每个数的出现几率相等、无法根据之前的数来预测下一个数的数列。一般随机数生成器的基本原理是:首先初始化一个随机种子,其初始值可以是任意的整数;在每次获取随机数时,以随机种子为基础进行某种特殊的运算,获得一个随机数并返回之,然后再对随机种子进行某种运算,改变随机种子的值。这样,就可以生成许多比较随机的数,但同一个初始值的随机种子将会生成完全相同的随机数列。 Pascal的System单元提供了两个与随机数有关的子程序:Randomize和Random。 Randomize过程用于初始化随机种子,其初始值取决于当前的系统时钟。 Random函数用于获取随机数 它有两种调用形式: Random,返回一个0到1之间(不包括1)的随机实数; Random(N),返回0至N之间(不包括N)的随机整数,N为Word类型整数。 另外,System单元中随机种子变量的标识符为RandSeed,你也可以手动修改它。随机数在信息学奥林匹克中可用于随机化搜索、穷举等算法,以优化其性能,也可用于在快速排序中选择关键数,以使其快速排序算法的最坏情况没有固定的相应数列。如果你希望使用了随机数的程序对同一个输入数据能有恒定的输出结果,可以设置RandSeed为一个定值。 ************************************************************************************************* 一个变态小算法 ******************************* 比较耗费机时,如果产生的数目少,就不要用这个算法了。 计算的是在一个范围内(如1-1000),随机抽取n个不相等的随机数。我的思想就是先定义一个用来存放的数组(这当然是必须的啦,废话),然后定义了一个二维数组(感觉很浪费空间),这个二维数组是用来存放已经生成随机数的范围,当然不是随意存放了,要按照自然顺序,但这还不必要定义二维的。二维主要是存放一个范围,即某一列的第一行存放的是范围的小值,而第二行存放的是范围的大值。这样新生成的随机数肯定是在范围之外的,因为范围是已生成随机数的范围啊。这样,每次取随机数时,先随机抽取在某两个范围数组值之间,再在这两个范围数组值之间取随机数。基本上就是这样了。 public class random { int count=500; //个数 int min=1; //最小值 int max=1000; //最大值 int[] r=new int[count]; //随机数存储数组 int[][] k=new int[2][count+2]; //存储范围数组,用于判断范围值 //一维数组用来存放范围的小值,二维用来存放大值 int l=0; //存储空间大小 public random() //初始化范围 {k[0][0]=min-1; k[1][0]=min-1; k[0][2]=max+1; k[1][2]=max+1; l=3; } public int ran(){ //来一个可以制造随机整数的东西 return (int)(Math.random()*1000000000); } public void p(int x,int c) //用来比较存储数组 { for(int i=0;i随机数与当前值的偏差为1,与当前值合并 if(k[0][i]-x==1){ k[0][i]=x; if (k[0][i]-k[1][i-1]==1) //如果与前一个范围值的最大值的值差为1与前一个值合并 {k[1][i-1]=k[1][i]; move(l-1,i); l--;} break;} //如果与但前范围值差大于1 else{ for(int j=l;j>i;j--){ //后移数组为插入值留个位置 k[0][j]=k[0][j-1]; k[1][j]=k[1][j-1]; } k[0][i]=x; //插入值 k[1][i]=x; l++; if (k[0][i]-k[1][i-1]==1) //如果插入值与前一个范围值相差1,则与前一个值合并 {k[1][i-1]=k[1][i]; move(l-1,i); l--;} break; }} } } public void move(int m,int n) //与前一个范围值合并的函数 { for(int j=n;j随机数的主函数 r[0]=ran()%max+min; //插入第一个值 if(r0==1) k[1][0]=r[0]; else{ k[0][1]=r[0]; k[1][1]=r[0];} for(int i=1;i2) z=ran()%(l-2); //判断有多少个空隙,就是有多少个范围,然后随机选取一个 else z=0; r[i]=ran2(k[0][z+1],k[1][z]); //在选取的范围中制造随机数 p(r[i],i); } } public int ran2(int x,int y){ //在固定范围内制造随机数 int m=x-y; m=ran()%(m-1); return m+y+1; } /*public static void main(String[] args) { random rr=new random(); rr.r(); for(int i=0;i
数字签名标准(DSS)的研究与实现 1. 引言 5 2.数论基础 6 2.1 基本定义 6 2.2 散对数问题 7 3.数字签名标准DSS 9 3.1 DSA算法描述 9 3.1.1 DSA算法参数 9 3.1.2 DSA签名过程 9 3.1.3 DSA签名验证 10 3.2 DSA算法证明 10 3.3 DSA算法变形 11 3.3.1 Yen和Laih的改进方法1 12 3.3.2 Yen和Laih的改进方法2 12 3.3.3 Naccache的改进方法 12 4. DSS参数产生 13 4.1 DSA素数产生 13 4.1.1 Miller-Rabin概率素性检验算法 13 4.1.2 DSA素数产生算法 14 4.1.3 任意长度素数生成算法 16 4.2 DSA的随机数产生算法 16 4.2.1 产生m个DSA私钥的算法 16 4.2.2 产生m个DSA每消息密钥数的算法 17 4.2.3 SHA-1构造函数G(t,c) 17 4.2.4 利用SHA-1构造任意长度随机数 18 4.3 DSA其他参数的产生 18 4.3.1 产生DSA的g算法 18 4.3.2 计算 的算法 19 4.3.3 SHA-1算法 19 5. 数字签名标准DSS的Java实现 24 5.1 DSA素数产生的Java实现 27 5.1.1 Miller-Rabin概率素性检验算法的Java实现 27 5.1.2 DSA素数产生算法的Java实现 28 5.1.3 任意长度素数生成算法 30 5.2 DSA随机数产生算法的Java实现 31 5.2.1 产生m个DSA私钥的算法的Java实现 31 5.2.2 产生m个DSA每消息秘密数的算法的Java实现 32 5.2.3 利用SHA-1构造单向函数G(t,c)算法的Java实现 33 5.2.4 利用SHA-1构造任意长度随机数的Java实现 34 5.3 DSA其他参数产生算法的Java实现 35 5.3.1 生成DSA的g算法的Java实现 35 5.3.2 计算 算法的Java实现 36 5.3.3 生成DSA公钥的Java实现 36 5.3.4 求模幂 的Java实现 37 5.3.5 SHA-1的Java实现 38 5.4 本文Java实现的数字签名标准(DSS)测试 38 5.4.1 本文Java实现的DSS签名测试 38 5.4.2本文Java实现的SHA-1测试 39 5.4.3本文Java实现的其他参数测试 40 6. DSS数字签名的应用 41 结束语 42 致谢 43 参考文献 44

110,571

社区成员

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

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

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