根据权重生成随机值

题目如下:有一个数值范围(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("%d\n",i);
			break;
		}
	  } 
	}
	
	return 0;
} 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值