最大样本

2023-11-21

如果我想对数字进行采样来创建向量,我会这样做:

set.seed(123)
x <- sample(1:100,200, replace = TRUE)
sum(x)
# [1] 10228

如果我想采样 20 个总和为 100 的随机数,然后采样 30 个数字,但总和仍为 100,该怎么办?我想这比看起来更具挑战性。?sample谷歌搜索并没有给我提供任何线索。如果与所需总和不够接近(例如在 5 以内),则进行采样然后拒绝,我猜可能需要一些时间。

有更好的方法来实现这一目标吗?

一个例子是:

foo(10,100) # ten random numbers that sum to 100. (not including zeros)
# 10,10,20,7,8,9,4,10,2,20

使用 R 的尝试

# Config
n <- 20L
target <- 100L
vec <- seq(100)
set.seed(123)

# R repeat loop
sumto_repeat <- function(vec,n,target) {
  res <- integer()
  repeat {
    cat("begin:",sum(res),length(res),"\n")
    res <- c( res, sample(vec,1) )
    if( sum(res)<target & length(res)==(n-1) ) {
      res[length(res)+1] <- target - sum(res)
    }
    # cat("mid:",sum(res),length(res),"\n")
    if(sum(res)>target) res <- res[-length(res)]
    if( length(res)>n | length(res)<n & sum(res)==target ) {
      res <- res[-sample(seq(length(res)),1)]
    }
    # cat("end:",sum(res),length(res),"\n")
    # cat(dput(res),"\n")
    if( sum(res)==target & length(res)==n ) break
  }
  res
}

test <- sumto_repeat(vec=vec,n=n,target=target)
> sum(test)
[1] 100
> length(test)
[1] 20

另外,我会考虑一下您想从哪个发行版中提取。我think有几种不同的方法可以让它精确地求和target with n元素(例如,您可以使最后一个元素始终为target - sum(res))可能有也可能没有不同的分布影响。

Rcpp 中的一个非常相似的算法,速度很快!

cpp_src <- '
Rcpp::IntegerVector xa = clone(x); // Vector to be sampled
Rcpp::IntegerVector na(n); // Number of elements in solution
Rcpp::IntegerVector sa(s); // Sum of solution

int nsampled;
int currentSum;
int dropRandomIndex;
int numZeroes;
Rcpp::IntegerVector remainingQuantity(1);
int maxAttempts = 100;

// Create container for our results
Rcpp::IntegerVector res(maxAttempts);
std::fill( res.begin(), res.end(), NA_INTEGER );

// Calculate min/max so that we can draw random integers from within range
Rcpp::IntegerVector::iterator mn = std::min_element(xa.begin(), xa.end()) ;
Rcpp::IntegerVector::iterator mx = std::max_element(xa.begin(), xa.end()) ;
std::cout << "mx = " << *mx << std::endl;

// Now draw repeatedly
nsampled = 0;
for( int i = 0; i < maxAttempts; i++ ) {
  std::cout << "\\n" << i;
  int r = *mn + (rand() % (int)(*mx - *mn + 1));
  res[i] = xa[r+1];
  // Calculate n and s for current loop iteration
  numZeroes = 0;
  for( int j = 0; j < maxAttempts; j++) 
    if(res[j]==0) numZeroes++;
  std::cout << " nz= " << numZeroes ;
  nsampled = maxAttempts - sum( is_na(res) ) - numZeroes - 1;
  currentSum = std::accumulate(res.begin(),res.begin()+i,0); // Cant just use Rcpp sugar sum() here because it freaks at the NAs
  std::cout << " nsamp= " << nsampled << " sum= " << currentSum;
  if(nsampled == na[0]-1) {  
    std::cout << " One element away. ";
    remainingQuantity[0] = sa[0] - currentSum;
    std::cout << "remainingQuantity = " << remainingQuantity[0];
    if( (remainingQuantity[0] > 0) && (remainingQuantity[0]) < *mx ) {
      std::cout << "Within range.  Prepare the secret (cheating) weapon!\\n";
      std::cout << sa[0] << " ";
      std::cout << currentSum << " ";
      std::cout << remainingQuantity[0] << std::endl;
      if( i != maxAttempts ) {
        std::cout << "Safe to add one last element on the end.  Doing so.\\n";
        res[i] = remainingQuantity[0];
      }
      currentSum = sa[0];
      nsampled++;
      if(nsampled == na[0] && currentSum == sa[0]) std::cout << "It should end after this...nsamp= " << nsampled << " and currentSum= " << currentSum << std::endl;
      break;
    } else {
      std::cout << "Out of striking distance.  Dropping random element\\n";
      dropRandomIndex = 0 + (rand() % (int)(i - 0 + 1));
      res[dropRandomIndex] = 0;
    }
  }
  if(nsampled == na[0] && currentSum == sa[0]) {
      std::cout << "Success!\\n";
      for(int l = 0; l <= i+1; l++) 
        std::cout << res[l] << " " ;
      break;
  }
  if(nsampled == na[0] && currentSum != sa[0]) {
    std::cout << "Reached number of elements but sum is ";
    if(currentSum > sa[0]) {
      std::cout << "Too high. Blitz everything and start over!\\n";
      for(int k = 0; k < res.size(); k++) {
        res[k] = NA_INTEGER;
      }
    } else {
      std::cout << "Too low.  \\n";

    }
  }
  if( nsampled < na[0] && currentSum >= sa[0] ) {
    std::cout << "Too few elements but at or above the sum cutoff.  Dropping a random element and trying again.\\n";
    dropRandomIndex = 0 + (rand() % (int)(i - 0 + 1));
    res[dropRandomIndex] = 0;
  }
}
return res;
'

sumto <- cxxfunction( signature(x="integer", n="integer", s="integer"), body=cpp_src, plugin="Rcpp", verbose=TRUE )

testresult <- sumto(x=x, n=20L, s=1000L)
testresult <- testresult[!is.na(testresult)]
testresult <- testresult[testresult!=0]
testresult
cumsum(testresult)
length(testresult)

用几个不同的值进行尝试,并产生有效的答案,除非它跑掉了。这里有一个警告,如果它远离所需的元素数量并且在“惊人的距离”内,那么它就会作弊——例如它不只是绘制最后一个值,而是计算该数字是否有效。

基准测试

See gist用于比较代码。

benchmarks

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最大样本 的相关文章

  • 在函数内部调用 clusterApply 时,性能会下降

    我遇到了一个奇怪的问题clusterApply 我已经能够尽可能地隔离它 如下所示 首先 我从全局环境运行以下代码 require parallel cl lt makeCluster rep localhost 20 SOCK xl lt
  • R:将 readRDS 应用于 .Rds 文件名的列表对象

    我有几个包含数据帧对象的 Rds 文件 我想对每个文件应用一个函数并将数据帧绑定到单个数据帧中 但是 当我尝试从文件名列表中读取多个 Rds 文件时 我收到错误 FUN X i 中的错误 从连接读取时出错 readRDS 不适用于列表吗 R
  • 在 R 中绘制对数正态概率密度

    我正在尝试在 R 中生成对数正态概率密度图 其中包含 3 个不同的均值对数和标准差对数 我尝试了以下方法 但我的图表太丑了 看起来一点也不好看 x lt seq 0 10 length 100 a lt dlnorm x meanlog 0
  • R 编程:如何计算数据框中两个单元格之间的差异并将它们保存在新列中

    尝试学习 R 并陷入自相关示例中 我想将 x 的差异与 y 的差异进行回归 我在数据框中有 x 和 y 并且希望将 x2 x1 的差值保存在新列 例如 dx 中 我不知道该怎么做 我拥有的 data1 x y 5 3 8 9 3 1 1 5
  • 根据另一列中的键累积一列中的值时出现问题

    我有一个看起来像这样的数据框 我需要使用 PROJ ID 列中的字符串创建一个新的值列 并形成 PROJ NAME 列中的值字符串 这里提供的解决方案 根据 r 中另一列的键累积一列中的值 https stackoverflow com q
  • 如何更改 Shiny 中 navbarPage 折叠的断点

    我想用shiny navbarPage collapsible TRUE 当在小屏幕上查看我的 Shiny 应用程序时 将导航元素折叠到菜单中 默认情况下 当浏览器宽度小于 940 像素时会触发折叠 有什么方法可以改变这一点 以便在稍大的浏
  • 将函数应用于 3d 数组的每一层,返回一个数组

    假设您有一个包含行 列和层的 3 维数组 A lt array 1 27 c 3 3 3 想象你有一个函数 它接受一个矩阵作为输入并返回一个矩阵作为输出 就像t 如何将该函数应用于数组的每一层 返回与第一层大小相同的另一个数组 我觉得我应该
  • 逻辑回归/二项式的 glmnet 误差

    当尝试将 glmnet 与 family binomial 配合以进行逻辑回归拟合时 出现此错误 gt data lt read csv DAFMM HE16 matrix csv header F gt x lt as data fram
  • 比较 R 中的两个字符向量

    我有两个 ID 字符向量 我想比较这两个字符向量 特别是我对以下数字感兴趣 A和B各有多少个ID 有多少个ID在A中但不在B中 有多少个ID在B但不在A 我还想画维恩图 以下是一些可以尝试的基础知识 gt A c Dog Cat Mouse
  • glmnet 未从 cv.glmnet 收敛 lambda.min

    我跑了20倍cv glmnet套索模型以获得 lambda 的 最佳 值 但是 当我尝试重现结果时glmnet 我收到一个错误 内容如下 Warning messages 1 from glmnet Fortran code error c
  • 为什么这些数字不相等?

    下面的代码显然是错误的 有什么问题 i lt 0 1 i lt i 0 05 i 1 0 15 if i 0 15 cat i equals 0 15 else cat i does not equal 0 15 i does not eq
  • 使用outer代替expand.grid

    我正在寻找尽可能快的速度并留在基地做该做的事expand grid做 我用过outer为过去类似的目的创建一个向量 像这样的东西 v lt outer letters LETTERS paste0 unlist v lower tri v
  • 带 R 的多彩标题

    我想添加颜色某些词在我的图表标题中 我已经能够在这里找到一些先例 http blog revolutionanalytics com 2009 01 multicolor text in r html 具体来说 我希望用撇号括起来的文本 在
  • ggplot散点图中的图例问题

    我想使用 ggplot 创建显示方法比较数据的散点图 绘图应包含原始数据 理想线和带误差的拟合线 图例应显示理想线和拟合线的线型 线宽 线颜色 我可以获得大部分我想要的东西 但是图例存在以下问题 图例显示每种线型有 2 条线 为什么 如何解
  • R 中的 Websocket

    我设法在 R 中建立到 Mtgox websocket 的连接 规格如下 url https socketio mtgox com mtgox Currency USD https socketio mtgox com mtgox Curr
  • 如何根据两个数据框中最近的日期进行匹配?

    假设我有两个数据框 例如 set seed 123 df1 lt data frame bmi rnorm 20 25 5 date1 sample seq Date as Date 2014 01 01 as Date 2014 02 2
  • 从数据框创建稀疏矩阵

    我正在做一项作业 尝试为 Netflix 奖项数据构建协作过滤模型 我使用的数据位于 CSV 文件中 我可以轻松地将其导入到数据框中 现在我需要做的是创建一个稀疏矩阵 其中用户作为行 电影作为列 每个单元格都由相应的评级值填充 当我尝试绘制
  • 如何在我自己的网络服务器上导出并托管 ggvis 图表?

    据我了解 ggvis 运行在闪亮的之上 但我不知道如何在没有 R shiny 的情况下导出在网络服务器上运行单个 ggvis 图表所需的所有文件 这对于交互式绘图来说是不可能的 因为 每个交互式 ggvis 图都必须连接到正在运行的 R 会
  • R Tidytext 和 unnest_tokens 错误

    对 R 非常陌生 已经开始使用 tidytext 包 我正在尝试使用参数来填充unnest tokens函数 这样我就可以进行多列分析 所以而不是这个 library janeaustenr library tidytext library
  • R中将矩阵拆分为子矩阵的函数

    我有一个 16 行 12 列的矩阵 M 我想将其拆分为 16 个矩阵的数组 每个矩阵有 4 行 3 列 我可以通过以下方式手动完成 M matrix sample 0 127 16 12 replace TRUE c 16 12 ma1 M

随机推荐

  • 通过java套接字传输大文件[重复]

    这个问题在这里已经有答案了 我编写了一个用于传输小文件的小型客户端 服务器代码 它使用数据输出流和数据输入流的 readFully 方法 由于显而易见的原因 此代码不适用于较大的文件 我正在考虑将大文件分割成每个 1Kb 的小块 然后再将它
  • python 中的稀疏矩阵 svd

    有谁知道如何在 python 中对稀疏矩阵执行 svd 运算 scipy sparse linalg 中似乎没有提供这样的功能 听上去像稀疏向量这就是您正在寻找的 SVDLIBC 有效地封装在 Python 中 无需在 RAM 中创建额外的
  • 将两个 NSArray 并排排序

    我有几个需要并排排序的数组 例如 第一个数组的名称为 Joe Anna Michael Kim 和 另一个数组保存地址 Hollywood bld Some street 3 That other street country road 数
  • 将 SSL 证书添加到密钥库

    有人可以指导我如何将证书添加到密钥库 Android 手机 示例代码会很有帮助 您需要的密钥库格式位于 BouncyCastle jar 中 您需要下载该文件 然后您创建密钥库 最后 您需要扩展 HTTPClient 有一个简单的例子说明如
  • 如何处理 momentjs 中的弃用警告

    我想使用 momentjs 检查无效的日期 时间字符串 var invalid 2017 03 18 23 00 00 if moment invalid isValid return valid date 这 正确地 抛出了一个堆栈跟踪
  • 在对话框中选择微调器时,Android espresso 中出现 RunTimeException

    我有一个活动 其中打开了一些对话框 该对话框上有一个微调器 我想在此微调器中选择一个特定值 但出现以下异常 java lang RuntimeException Waited for the root of the view hierarc
  • ajax调用JQUERY中的变量数据

    我试图在 jquery 的 AJAX 调用中使用变量 但它不起作用 move 变量包含不同的值 请检查以下代码 var move next ajax type POST url somephp php data move 1 建议在数据中使
  • Slack 一次将多条消息发布到一个频道

    我需要将多个机器人回复 动态确定的响应 发布到同一频道 最明显的方法似乎是使用此 API 方法连续为每条消息执行 HTTP POST https api slack com methods chat postMessage 有没有办法将消息
  • 在 gnuplot 中绘制具有多个记录的一维二进制数组 (uint8)

    我知道这个问题类似于Gnuplot 如何从二进制格式绘制多个时间序列 但是我已经设置了一个略有不同的示例 所以希望可以发布 自我回答如下 我正在生成这样的二进制数据 见下文genbindata plPerl 脚本 perl genbinda
  • 使用 XLSX 导出 html 表(表到工作表)时隐藏/删除列

    我希望能够以 Excel 文件格式导出我的 DOM 表格 我的函数 Typescript 3 5 Angular 8 ExportTOExcel const ws XLSX WorkSheet XLSX utils table to she
  • Bash - 正确清除最后的输出

    我正在尝试创建一个可更新的进度状态 为了做到这一点 我需要能够完全清除最后的输出 以便我可以更新它 回车可以工作 但是当输出长于终端宽度并回绕时 将无法清除最后一个输出 所以我使用 tput n 0 while n ne 100 do n
  • 在 MySQL 中存储 SHA1 哈希值

    当我想将 SHA1 哈希结果存储在 MySQL 数据库中时 我有一个简单的问题 应该多长时间VARCHAR我存储哈希结果的字段是什么 我会用VARCHAR适用于可变长度数据 但不适用于固定长度数据 因为 SHA 1 值是always160位
  • 如何延迟一个转换而不延迟另一个转换?

    我设置了两个转换 circle 我只希望不透明度有延迟 但我只能在两个过渡都进行的地方进行延迟 我的全部目标是在圆圈处于中间旋转时 即正好 90 度 改变不透明度 但我会自己计算时间 我只想知道如何仅延迟一次转换 circle backgr
  • 图像在模拟器中显示,但在 iPhone 设备上不显示

    因此 当我从设备运行应用程序时 图片就会显示出来 一切都运行良好 然而 当我转到该设备时 我运行的 38 张图片中大约有 10 张没有显示 我正在从 sqlite 数据库中提取图像的名称 并且我已经检查过 名称 大小写和所有内容都是正确的
  • 在 Django 中实现“开放时间”的任何现有解决方案

    我正在为一位希望能够更改营业时间的客户制作一个网站 对于他的每一个不同的商店 Django 是否有针对此类问题的现有解决方案 你是什 么意思 看起来很简单 根据您工作日的订单进行调整 如果您愿意 可以添加验证 但人们应该足够聪明 不需要对这
  • Django 创建自定义模型字段

    我正在尝试在 Django 中创建一个自定义字段 它将采用十进制货币值 例如 1 56 并将其作为整数 例如 156 保存在数据库中以存储货币值 这就是我到目前为止所拥有的 我已经设置了固定值来测试 class CurrencyField
  • 为什么考虑_all_requests_local 因 rspec 配置而失败

    rspec rails 2 7 0 导轨 3 0 10 邮政 Rails 3 1 错误捕获对我来说无关紧要 Code class ApplicationController lt ActionController Base unless R
  • Chrome 检查元素的奇怪问题

    When I load my page one of the images is higher than it is supposed to be When I right click Inspect element anywhere on
  • DatePicker 回发后消失

    我有一个与 jquery DatePicker 关联的 asp TextBox 此输入有一个更新文字控件的 onTextChangedEvent 所有这些代码都位于 UpdatePanel 内 因此文字控件会更改 但页面不会刷新 我面临的问
  • 最大样本

    如果我想对数字进行采样来创建向量 我会这样做 set seed 123 x lt sample 1 100 200 replace TRUE sum x 1 10228 如果我想采样 20 个总和为 100 的随机数 然后采样 30 个数字