Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据偏好组合样本中的数字_R_Sample_Dice - Fatal编程技术网

R 根据偏好组合样本中的数字

R 根据偏好组合样本中的数字,r,sample,dice,R,Sample,Dice,因此,我正在为一个棋盘游戏编写一个函数,我有一个示例“Rolls”,它由以下公式给出: Rolls <- sample(1:6, 6, replace = TRUE) Rolls以下方法似乎有效。我试图用解释性名称编写函数,并以一种不难理解的方式完成每一步 其主要思想是使用内置的{utils}中的combn()来获得一个数据帧,其中包含“合并”的可能组合 从可能的组合中,我们只能合并1个模具一次。(如果您已经合并了第1个和第3个,您应该无法合并第3个和第4个,因为第3个已经被使用)。此步

因此,我正在为一个棋盘游戏编写一个函数,我有一个示例“Rolls”,它由以下公式给出:

Rolls <- sample(1:6, 6, replace = TRUE)

Rolls以下方法似乎有效。我试图用解释性名称编写函数,并以一种不难理解的方式完成每一步

其主要思想是使用内置的{utils}中的
combn()
来获得一个数据帧,其中包含“合并”的可能组合

从可能的组合中,我们只能合并1个模具一次。(如果您已经合并了第1个和第3个,您应该无法合并第3个和第4个,因为第3个已经被使用)。此步骤在
获取要删除的骰子的矢量中完成。最后,我们每2个骰子替换一个合并目标

我确信有更好、更有效的方法,我写不出来。还有其他方法,步骤(调用)要少得多,但我更喜欢让它更明确,这样您就可以了解正在发生的事情,如果您希望改进,请删除一些不必要的步骤或调整您喜欢的方式

提示:如果您想一步一步地了解函数内部的情况,请使用
debugonce(merge_dice_matching_nr)
在下次运行函数时进入该函数。在调试模式下,您可以缓慢地遍历函数,并在函数内部检查每个对象。)

库(dplyr)
掷骰子$orignial\u掷骰子
#> [1] 5 6 6 1 5 1
#> 
#>$dice\u posite\u要移除
#> [1] 4 6
#> 
#>$results\u合并
#> [1] 5 6 6 5 2
滚动%>%merge\u dice\u matching\u nr(合并=5)
#>$orignial_投掷
#> [1] 5 6 6 1 5 1
#> 
#>$dice\u posite\u要移除
#>整数(0)
#> 
#>$results\u合并
#>数字(0)
滚动%>%merge\u dice\u matching\u nr(merging=6)
#>$orignial_投掷
#> [1] 5 6 6 1 5 1
#> 
#>$dice\u posite\u要移除
#> [1] 1 4 5 6
#> 
#>$results\u合并
#> [1] 6 6 6 6
另一个允许数值向量参数的实现 这是另一个允许数字向量输入的选项,以便一次处理一个项目

merge_dice_matching_nr <- function(throw, merging, merged_results_only=FALSE) {
  
  i_throw <- throw
  for (i in 1:length(merging)) {
    i_merging <- merging[i]
    df_res <- get_data_frame_of_possible_combs(throw = i_throw, merging = i_merging)
    
    vec_to_remove <- get_vec_of_dice_to_remove(df_res)
    
    
    if (length(vec_to_remove)>0) {
      # if there is nothing to merge, return  results_merged as the original throw
      res_merged <- append(i_throw[-vec_to_remove], rep(i_merging, length(vec_to_remove)/2))  
    } else {
      res_merged <- i_throw
    }
    i_throw <- res_merged
  } 
  
  if (merged_results_only) {
    return(c(res_merged))
  }
  ret_list <- list("original_throw" = throw, 
                   "dice_posit_to_remove" = vec_to_remove,
                   "results_merged" = res_merged)
  
  return(ret_list)
}


set.seed(2)
(roll <- roll_dice()) %>% 
  merge_dice_matching_nr(merging = 2)

roll %>% 
  merge_dice_matching_nr(merging = c(2, 12, 10, 12, 24))

# $original_throw
# [1] 5 6 6 1 5 1

# $dice_posit_to_remove
# [1] 1 2

# $results_merged
# [1] 24

merge\u dice\u matching\n仅用于澄清:您的最终样本是
4(=3+1)
2
1
1
4(已从第一轮开始)
。对吗?就是少了一个死亡。对吗?没错,其中一个4是我们推出的,另一个4是3+1的结果。是的,最终的样品根据添加的数量(长度)变小了,因为使用了两个数字来制作一个新的。我自己也试过,效果很好,这真是太棒了,非常感谢你,只是想知道你是否知道,否则,我会把代码弄得一团糟,看看我能不能做到,使用这段代码,我能做到这样的事情:尽可能多做5个,然后如果不能再做(或者根本没有),看看是否能做6个。这个代码可以吗?需要做一些小的修改。参见编辑回答合并处的顺序=c(2,12,10,12,24)重要吗?如果24是第一个,它会先尝试合并24,然后尝试做2,然后是12,等等?它一次只尝试合并2个骰子,所以顺序很重要。以任何方式合并到一个数字都是相当复杂的,因为有几种可能的合并方式。当然,这是可能的,但会大大增加函数的复杂性
set.seed(1212)
Rolls <- roll_dice()

Rolls
# [1] 2 1 5 4 6 4
Rolls <- Rolls %>% merge_dice_matching_nr(merging = 6, merged_results_only = T)
Rolls
# [1] 6 4 6 6
Rolls <- Rolls %>% merge_dice_matching_nr(5, merged_results_only = T)
Rolls
# [1] 6 4 6 6