查看单个帖子
旧 2019-12-03, 07:03   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
默认 快速计算JS中大型集合的组合和置换比率的方法

面对大量数字时,尝试以一种快速有效的方法来计算比率。这个想法是一个带有数字的数组,例如Box = [1、2、3、4],并将数组中的每个项目命名为1 = A,2 = B,3 = C,4 = D。然后使用数字呼叫步骤 。我正在尝试为框中的每个元素实现此目标,例如,在第一个元素A仅具有3个步骤的情况下。

在步骤1中,取A的值并将其除以框和

step 1 => 1/10 = 0.1 在步骤2中,将BA,CA,DA组合起来,然后除以盒总和,每次减去前一个值

=> (2/10)(1/8) + (3/10)(1/7) + (4/10)(1/6) = 0.1345 在第3步中,将BCA,BDA,CBA,CDA,DBA,DCA组合在一起,然后除以盒总和,每次减去前一个值

=> (2/10)(3/8)(1/5) + (2/10)(4/8)(1/4) + (3/10)(2/7)(1/5) + (3/10)(4/7)(1/3) + (4/10)(2/6)(1/4) + (4/10)(3/6)(1/3) = 0.2143 如果对盒数组B = 0.7587,C = 0.8702,D = 0.9222中的所有元素执行相同的过程以检验计算是否正确,则最后返回A = 0.1 + 0.1345 + 0.2143 = 0.4488的所有步骤的总和比率的总和等于3,即使用的步数相同。

如果增加框中的步骤和元素,则应按相同顺序进行所有组合。如果Box的大小为1000,并且Box中的每个元素有10个步骤,此计算可以快速运行并且不会用完内存吗?

具有3个步骤 [A,B,C,D] 的数组长度4的递推公式

对于元素A

step 1 : A step 2 : BA CA DA step 3 : BCA BDA CBA CDA DBA DCA 对于元素B

step 1 : B step 2 : AB CB DB step 3 : ACB ADB CAB CDB DAB DCB 对于元素C

step 1 : C step 2 : AC BC DC step 3 : ABC ADC BAC BDC CAD CBD 对于元素D

step 1 : D step 2 : AD BD CD step 3 : ABD ACD BAD BCD DAC DBC 包含5个元素和4个步骤的数组[A,B,C,D,E]

对于元素A:

step 1: A step 2: BA CA DA EA step 3: BCA BDA BEA CBA CDA CEA DBA DCA DEA EBA ECA EDA step 4: BCDA BCEA BDCA BDEA BECA BEDA CBDA CBEA CDBA CDEA CEBA CEDA DBCA DBEA DCBA DCEA DEBA DECA EBCA EBDA ECBA ECDA EDBA EDCA 如果无法使用JS,这是我在Matlab代码中的尝试,有没有办法改善Matlab代码

% sample code to test userTickets = [1, 2, 3, 4]; users = [0, 0, 0, 0]; userCount = 4; draws = 3; for player = 1 : length(users) userLuck = 0; for draw = 1 : prizes userLuck = userLuck + cardCombo(player, userTickets, draw); end users(player) = userLuck; end total = sum(users); **** npermutek

function [A, I] = npermutek(v,k) narginchk(2,3); nck = nchoosek(1:numel(v),k); permutes = perms(1:k); I = nck(:,permutes); I = reshape(I,[],k); I = sortrows(I,1:k); A = v(I); end ****卡组合

function [result] = cardCombo(player, cards, draw) playerCards = cards(player); opponentCards = cards(setdiff(1:end,player)); cardCount = sum(cards); if draw == 1 result = playerCards/cardCount; elseif draw == 2 result = 0; for n = 1 : length(opponentCards) result = result + ((opponentCards(n)/cardCount) * (playerCards/ (cardCount - opponentCards(n)))); end else combo = npermutek(opponentCards, draw -1); combWithPlayer = repmat(playerCards, size(combo,1),1); combo = [combo combWithPlayer]; rowSize = size(combo, 1); colSize = size(combo,2); rowSum = 0; for row = 1 : rowSize rowMul = 1; sub = 0; for col = 1 : colSize num = combo(row, col); rowMul = rowMul * (num / (cardCount - sub)); sub = sub + num; end rowSum = rowSum + rowMul; end result = rowSum; end end

更多&回答...
poster 当前离线   回复时引用此帖