我是靠谱客的博主 文艺饼干,最近开发中收集的这篇文章主要介绍根据权重生成随机值,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目如下:有一个数值范围(n,m),其中n到m范围内每一个数值i的权重都为i,请根据每一个数值的权重大小生成随机数。

例子:可以把本题当作玩大乐透彩票,每次抽奖生成的奖金概率都是不同的,比如中了5元,200,和500万,每次生成的数值自然是5元的多,200的其次,500万的渺茫的道理,权重值已经给出,本题理解题意了自然迎刃而解。

解决本题目的思想是首先对n到m范围内的每一个数进行求概率值,然后根据概率值进行进行范围分段,最后生成一个(0,1)的均匀随机值,并根据该随机值去匹配所在的概率段。最后输出所在概率段的下标即为概率值。代码如下:

java版

import java.util.Scanner;
public class Main{
public static void main (String[]args){
int n,m;
Scanner sc = new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
double a[] = new double[1000];
int i;
double s=0;
for(i=n;i<=m;i++){
s=s+i;
}
for(i=n;i<=m;i++){
a[i]=i/s;
}
while(true){
double r=Math.random();//生成0-1的均匀随机数
for(i = n;i<=m;i++){
if(r<a[i]){
System.out.println(i);
break;
}
}
}
}
}

C语言版

#include<stdio.h>
#include<stdlib.h>
int main(){
int n,m;
scanf("%d%d",&n,&m);
double a[1000]; //定义一个数组存概率
int i; //n<=i<=m
double sum=0;
for(i=n;i<=m;i++){
sum+=i;
}
for( i=n;i<=m;i++){
a[i]=double(i)/sum;
//获得分数段
}
double r;
while(true){
r = rand()/(RAND_MAX+1.0);//生成0-1内的随机数
for(i=n;i<=m;i++){
if(r<a[i]){
//比较随机数所在概率范围段
printf("%dn",i);
break;
}
}
}
return 0;
} 

 

最后

以上就是文艺饼干为你收集整理的根据权重生成随机值的全部内容,希望文章能够帮你解决根据权重生成随机值所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部