奇葩吧 关注:764,543贴子:7,066,312

写了个程序跑了一下

只看楼主收藏回复



IP属地:江苏来自Android客户端1楼2024-02-26 18:09回复
    首先是按照图示的要求,直接跑


    IP属地:江苏来自Android客户端2楼2024-02-26 18:13
    收起回复
      代码如下:
      function [finalMoney, moneyMatrix] = gambleMoney(m, n) % 初始化 currentMoney = m; % 当前剩余的钱 bet = 1; % 当前轮的投入 moneyMatrix = zeros(1, n); % 记录每轮后剩余的钱 % 对每一轮进行模拟 for i = 1:n if currentMoney <= 0 % 没钱了就停止 break; end if rand() <= 0.5 % 一半的概率赢 currentMoney = currentMoney + bet; % 赢了就加上投入的钱 bet = 1; % 下一轮重新投入1块钱 else % 一半的概率输 currentMoney = currentMoney - bet; % 输了就减去投入的钱 bet = min(2*bet, currentMoney); % 下一轮翻倍投入,但不超过剩余的钱 end moneyMatrix(i) = currentMoney; % 记录这一轮后剩余的钱 end % 绘图 figure; plot(1:n, moneyMatrix); title('Money Variation Over Rounds'); xlabel('Round'); ylabel('Money Left'); % 返回最终的剩余金额和每轮的金额记录 finalMoney = currentMoney;end


      IP属地:江苏3楼2024-02-26 18:15
      收起回复


        IP属地:江苏4楼2024-02-26 18:16
        收起回复
          然后我又修改了一下逻辑,改成如果下次要投的钱超过原本金额的一半,那么也终止,重新变成1块
          function [finalMoney, moneyMatrix] = gambleMoneyUpdated(m, n)
          % 初始化
          currentMoney = m; % 当前剩余的钱
          bet = 1; % 当前轮的投入
          moneyMatrix = zeros(1, n); % 记录每轮后剩余的钱
          % 对每一轮进行模拟
          for i = 1:n
          if currentMoney <= 0 % 没钱了就停止
          break;
          end
          if rand() <= 0.5 % 一半的概率赢
          currentMoney = currentMoney + bet; % 赢了就加上投入的钱
          bet = 1; % 下一轮重新投入1块钱
          else % 一半的概率输
          currentMoney = currentMoney - bet; % 输了就减去投入的钱
          if bet > currentMoney / 2 % 如果下次需要投入的钱超过剩余钱的1/2
          bet = 1; % 下一轮也从1开始投入
          else
          bet = min(2 * bet, currentMoney); % 否则,下一轮翻倍投入,但不超过剩余的钱
          end
          end
          moneyMatrix(i) = currentMoney; % 记录这一轮后剩余的钱
          end
          % 绘图
          figure;
          plot(1:n, moneyMatrix);
          title('Money Variation Over Rounds');
          xlabel('Round');
          ylabel('Money Left');
          % 返回最终的剩余金额和每轮的金额记录
          finalMoney = currentMoney;
          end


          IP属地:江苏5楼2024-02-26 18:18
          回复


            IP属地:江苏6楼2024-02-26 18:21
            收起回复
              可以看出变得稳定了一些


              IP属地:江苏7楼2024-02-26 18:21
              回复
                但是怎么说呢,有效果,但是不多,因为不管哪种,当次数达到一定后,基本都是血本无归


                IP属地:江苏8楼2024-02-26 18:22
                收起回复
                  又写了一个调用函数


                  IP属地:江苏来自Android客户端9楼2024-02-26 18:29
                  回复
                    100块钱跑k次,进行100次循环,结果如下:


                    IP属地:江苏来自Android客户端10楼2024-02-26 18:31
                    回复
                      k为100


                      IP属地:江苏来自Android客户端11楼2024-02-26 18:32
                      回复
                        k为1000


                        IP属地:江苏来自Android客户端12楼2024-02-26 18:32
                        收起回复
                          k为10000


                          IP属地:江苏来自Android客户端13楼2024-02-26 18:32
                          收起回复
                            可以发现,当不停投入后,基本必然会血本无归。而赌博恰恰会让人无法停手。所以,不赌为赢


                            IP属地:江苏来自Android客户端14楼2024-02-26 18:33
                            收起回复
                              第五楼被吞了 重发一下
                              然后我又修改了一下逻辑,改成如果下次要投的钱超过原本金额的一半,那么也终止,重新变成1块
                              function [finalMoney, moneyMatrix] = gambleMoneyUpdated(m, n)
                              % 初始化
                              currentMoney = m; % 当前剩余的钱
                              bet = 1; % 当前轮的投入
                              moneyMatrix = zeros(1, n); % 记录每轮后剩余的钱
                              % 对每一轮进行模拟
                              for i = 1:n
                              if currentMoney <= 0 % 没钱了就停止
                              break;
                              end
                              if rand() <= 0.5 % 一半的概率赢
                              currentMoney = currentMoney + bet; % 赢了就加上投入的钱
                              bet = 1; % 下一轮重新投入1块钱
                              else % 一半的概率输
                              currentMoney = currentMoney - bet; % 输了就减去投入的钱
                              if bet > currentMoney / 2 % 如果下次需要投入的钱超过剩余钱的1/2
                              bet = 1; % 下一轮也从1开始投入
                              else
                              bet = min(2 * bet, currentMoney); % 否则,下一轮翻倍投入,但不超过剩余的钱
                              end
                              end
                              moneyMatrix(i) = currentMoney; % 记录这一轮后剩余的钱
                              end
                              % 绘图
                              figure;
                              plot(1:n, moneyMatrix);
                              title('Money Variation Over Rounds');
                              xlabel('Round');
                              ylabel('Money Left');
                              % 返回最终的剩余金额和每轮的金额记录
                              finalMoney = currentMoney;
                              end


                              IP属地:江苏来自Android客户端15楼2024-02-26 18:35
                              回复