c51随机数不重复_scala生成随机数注意

又是一个采坑之旅。

scala的算子分为两类,transformer算子和action算子。

由于scala是惰性的,在transformer算子执行时,只是记录这个操作,而并没有真正的执行,只有遇到action算子,才会将之前的所有操作真正执行。

因此,当在transformer之后,多次进行action调用,若没有持久化,是重复运行的,也就是说,假如你在dataframe里生成了一列随机数,后面先用这个随机数做了列变换,然后再用对这个dataframe做筛选之类的操作。比如这样:

val random = udf { (count:Long) => {
scala.util.Random.nextDouble()
}
}
val sample = 0.0001
df_sdk_filter0 =df_sdk_filter0.withColumn("rand",random( col("count")))
val cal_p = udf { (count:Long, rand:Double) => {
val p = 1-(sample*all_count/count+math. sqrt(sample*all_count/count))
var res=1
if (p>rand){
res=0
}
else{
res=1
}
res
}
}
//先生成一列flag,判断随机数与计算出的公式大小
df_sdk_filter0 = df_sdk_filter0.withColumn("flag", cal_p($"count", $"rand"))//.persist()
df_sdk_filter0.show()
//再对flag进行筛选
val df_sdk_filter = df_sdk_filter0.filter("flag=1")

这两个action操作,得到的结果是不一样的,因为相当于随机数运行了两次

所以先persist持久化,才能保证之后的所有对随机数进行的操作,都是针对同一个随机数,而不会变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值